public <T extends BusinessObject> void delete(T bo) throws DataException {
    Connection conn = ConnectionPool.getInstance().get();
    try {
      // go through each level of the class hierarchy and delete on each table
      Class boClass = bo.getClass();
      while (true) {
        PreparedStatement stmt = conn.prepareStatement("DELETE FROM " + boClass.getSimpleName().toLowerCase() + " WHERE id=?");
        try {
          stmt.setString(1, bo.getId());
          stmt.executeUpdate();
        }finally{
          stmt.close();
        }
        if (boClass == BusinessObject.class) {
          break;
        }
        boClass = boClass.getSuperclass();
      }
      conn.commit();

      // remove it from the cache
      Cache.getInstance().remove(bo.getId());
    }catch (Exception e) {
      e.printStackTrace();
      try{
        conn.rollback();
      }catch (SQLException e2) {
        throw new DataException("Could not roll back the database transaction!", e2);
      }
      throw new DataException("An error occurred while saving the business object information.", e);
    }finally {
      ConnectionPool.getInstance().release(conn);
    }
  }//update