2014-06-25 2 views
1

Dans mon application Web, il existe un certain nombre d'entités, et la plupart nécessitent des opérations CRUD. Je pense donc à écrire un DAO générique capable de gérer CRUD pour toutes les entités. J'ai trouvé un article de tutoriel d'IBM, mais je ne comprends pas très bien l'implémentation générique utilisant le type générique 'T' et 'PK'. L'article estCréation d'une classe DAO générique pour Hibernate

J'ai écrit le DAO suivant en utilisant le type d'objet dans toutes les méthodes, et ils semblent fonctionner très bien - toutes mes entités sont capables de faire CRUD avec la classe CommonDao suivante. Bien que cela fonctionne pour mes besoins, je cherche quelle est la meilleure pratique pour implémenter une classe DAO générique pour Hibernate.

public class CommonDao 
{ 
    private final static SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); 

    public CommonDao() {} 

    @UnitOfWork 
    public List findAll(Object className) 
    { 
     List types = null; 

     Session session = sessionFactory.openSession(); 
     Criteria criteria = session.createCriteria(className + ".class"); 
     types = (List <Object>) criteria.list(); 
     session.close(); 

     return types; 
    } 

    @Transactional 
    public void saveObject(Object obj) 
    { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     session.saveOrUpdate(obj); 

     tx.commit(); 
     session.close(); 
    } 

    @Transactional 
    public void saveObjectWithManyEntities(Object obj, Set<Object> objects) /* for OneToMany relationships */ 
    { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     session.saveOrUpdate(obj); 

     for (Object o : objects) 
     { 
      session.save(o); 
     } 

     tx.commit(); 
     session.close(); 
    } 
} 
+2

L'utilisation apparemment aléatoire de 'save' vs' saveOrUpdate' ne vous donne aucun avantage. Sans génériques, vous avez également recours à la diffusion, qui introduit des erreurs de type à l'exécution. J'envisagerais sérieusement de réécrire cette classe de manière générique - et si possible en utilisant des requêtes de critères JPA. 'List' - c'est-à-dire que le type raw' List' ne devrait jamais être vu dans Java moderne. –

+0

Il ya une discussion très similaire ici ... http: //stackoverflow.com/questions/3573479/comment-create-a-generic-dao-class-using-hibernate-context-sessions? Rq = 1 – Nilesh

Répondre

2

La meilleure façon de le faire est d'inclure des données Spring dans votre projet. Les dépôts JPA offrent CRUD de base, la pagination, le tri et la plupart de vos requêtes pourraient être construites automatiquement à partir de la convention de nommage des méthodes.

Avant les données de printemps, nous aurions recours à ce genre de Daos générique, mais plus maintenant.

+0

Bien suggestion. @TonyGW - vous pouvez trouver cette réponse sur Spring Data utile http://stackoverflow.com/questions/9721383/hibernate-crud-generic-dao?rq=1 – Nilesh

Questions connexes