2011-02-24 83 views
63

最近我一直在用Hibernate 3.5和Spring 3做一些工作,我對Hibernate相當新穎,並且認爲在Spring中的HibernateDaoSupport類使得使用Hibernate和我的域類很好很容易。爲什麼不建議使用HibernateDaoSupport?

但是,當搜索一個無關的問題時,我看到有人提到HibernateDaoSupport不是使用Spring和Hibernate的最佳方式。任何人都可以點亮:

  • 爲什麼不推薦?
  • 什麼是最好的(或至少被接受)的方式來集成Hibernate和Spring?

回答

87

使用HibernateDaoSupport/HibernateTemplate不推薦,因爲它不必要 您的代碼與Spring類。

爲了集成對Spring管理的事務的支持,使用這些類在Hibernate的舊版本中是不可避免的。

但是,由於Hibernate 3.0.1不再需要它 - 您可以在使用Spring管理的事務時使用普通的Hibernate API編寫代碼。您只需要配置Spring事務支持,當需要使用會話時,請注入SessionFactory並呼叫getCurrentSession()

HibernateTemplate的另一個好處是異常翻譯。如果沒有HibernateTemplate,則可以通過使用@Repository註釋來實現相同的功能,如Gareth Davis的答案所示。

參見:

+0

感謝您的意見。感謝Spring文檔的鏈接,其實很明顯。我會將您的帖子標記爲答案,因爲它回答了我的主要問題,謝謝。 – C0deAttack 2011-02-24 14:28:49

+1

除了'SessionFactory',您可以使用Hibernate的JPA 2實現(注入'EntityManager'作爲起點)。 – Jan 2011-08-15 10:24:31

+4

需要注意的是,Spring已經從Hibernate 4包中刪除了HibernateDaoSupport/HibernateTemplate。所以,如果你現在使用這些類,當你升級到Hibernate 4時,你將需要做一些重構。 – SteveT 2012-06-29 13:50:21

17

對於我的錢,使用HibernateDaoSupport沒有任何問題。它在3.0版本中不會被棄用。

你能否提供你找到的問題編號,可能是他們引用了一個非常具體的用例。

替代方法是使用@Repository註釋。這將連接相同的異常轉換(HibernateTemplate的一大優點),並允許您使用自己的超類或僅僅是爲了避免擴展第三方框架類。

@Repository 
public class YourFooDao { 

    @Resource 
    private SessionFactory sessionFactory; 

    private Foo get(long id){ 
     return (Foo) sessionFactory.getCurrentSession().get(id); 
    } 
} 
+4

+1 - 我還是喜歡'HibernateDaoSupport'和'HibernateTemplate',因爲它們提供了比原休眠'Session' API更豐富的API。 – skaffman 2011-02-24 14:25:54

+0

感謝關於@Repository註釋的提示,我一定會在文檔中找到更多關於它的內容。我找不到第一次看到這個提到的線程,對不起。 – C0deAttack 2011-02-24 14:27:27

+0

@skaffman好,如果Hibernate有一個糟糕的API,那麼可能Hibernate不應該使用(我只用它作爲JPA提供者) – 2011-02-24 15:56:11

相關問題