úterý 9. září 2008

Generické DAO pro Hibernate/JPA

Nečekejte žádnou raketovou vědu, ale jenom takový malý tip ;-). Na pár projektech jsem se setkal s tim, že pro každou entitu bylo ručně vytvořeno a nebo vygenerováno DAO. Většina těchto DAO objektů však obsahovala pouze metody pro CRUD operace (Create, Update, Delete) pro danou entitu. To vedlo k často se opakujícímu kódu, který rozhodně nebyl potřeba. Díky generickým typům zavedeným v Jave 5 můžeme vytvořit generické a typově bezpečné DAO, které bohatě poslouží jako náhrada za původní generované objekty.

public class GenericDAO<E extends Object>{
  private Class<E> entityClass;
  
  protected GenericDAO(Class<E> entityClass) {
    this.entityClass = entityClass;
  }

  public E get(Serializable id) {
    return (EgetSesion().get(entityClass, id);
  }
  
  public void save(E entity) {
    getSesion().save(entity);
  }
  
  public void update(E entity) {
    getSesion().save(entity);
  }
  
  public void delete(E entity) {
    getSesion().delete(entity);
  }
      
  protected Session getSesion() {
    return null//get Hibernate session from somewhere
  }
  
  protected Class<E> getEntityClass() {
    return entityClass;
  }
  
  public static <T extends Object> GenericDAO<T> createGenericDAO(Class<T> clazz) {
    GenericDAO<T> dao = new GenericDAO<T>(clazz);    
    return dao;
  }
}

Takto připravené DAO je možné jednoduše používát v kódu.

GenericDAO<Dog> dao = GenericDAO.createGenericDAO(Dog.class);
Dog dog = dao.get(1);