2014-06-25 20 views
1

在我的Web應用程序中,有相當多的實體,並且大多數實體都需要CRUD操作。所以我正在考慮編寫一個可以處理所有實體的CRUD的通用DAO。我找到了來自IBM的教程文章,但不太瞭解使用泛型類型'T'和'PK'的泛型實現。這篇文章是at this link爲Hibernate創建一個通用的DAO類

我在所有的方法中使用Object類型編寫了以下DAO,它們看起來工作得很好 - 我的所有實體都能夠使用以下CommonDao類進行CRUD。雖然它適用於我的需求,但我正在尋找實現Hibernate的通用DAO類的最佳實踐。

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

看起來隨機使用'save'和'saveOrUpdate'並不會對你有任何好處。如果沒有泛型,你也會使用轉換,這會引入運行時類型錯誤。我會認真考慮以通用的方式重寫這個類 - 並且如果可能的話使用JPA標準查詢。 'List' - 即現代Java中從未見過的'List'原始類型。 –

+0

這裏有一個非常類似的討論... http://stackoverflow.com/questions/3573479/how-to-create-a-generic-dao-class-using-hibernate-context-sessions?rq = 1 – Nilesh

回答

2

最好的辦法是將Spring Data包含到你的項目中。 JPA存儲庫提供了基本的CRUD,分頁和排序,並且大多數查詢可以通過方法命名約定自動構建。

在Spring數據之前,我們會使用這樣的通用道而不再是。

+0

好建議。 @TonyGW - 你可能會發現這個答案在Spring Data有幫助http://stackoverflow.com/questions/9721383/hibernate-crud-generic-dao?rq=1 – Nilesh