2011-02-24 129 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

相关问题