为什么不建议使用HibernateDaoSupport?


69

我最近一直在使用Hibernate 3.5和Spring 3做一些工作,但是我对Hibernate还是很陌生,并认为HibernateDaoSupportSpring的类使在我的域类中使用Hibernate变得容易又好用。

但是,在搜索一个不相关的问题时,我看到有人提到,这HibernateDaoSupport不是使用Spring和Hibernate的最佳方法。任何人都可以阐明以下几点:

  • 为什么不推荐?
  • 整合Hibernate和Spring的最佳方法(或至少是公认的方法)是什么?

Answers:


92

不建议使用HibernateDaoSupport/,HibernateTemplate因为它不必要地将您的代码与Spring类联系起来。

为了集成对Spring管理的事务的支持,在较早版本的Hibernate中不可避免地使用这些类。

但是,从Hibernate 3.0.1开始,您将不再需要它-您可以在使用Spring管理的事务时针对普通的Hibernate API编写代码。您需要做的就是配置Spring事务支持,在需要使用会话时注入SessionFactory并调用getCurrentSession()它。

HibernateTemplate异常翻译的另一个好处是。如果没有HibernateTemplate相同的功能,则可以通过使用@Repository注释来实现,如Gareth Davis的答案所示。

也可以看看:


感谢您的输入。同时,感谢您链接到Spring文档,实际上非常清楚。我会将您的帖子标记为答案,因为它可以回答我的主要问题,谢谢。
C0deAttack 2011年

1
另外,SessionFactory您也可以使用Hibernate的JPA 2实现(注入一个EntityManager起点)。
1

5
值得注意的是,Spring已从其Hibernate 4软件包中删除了HibernateDaoSupport / HibernateTemplate。所以,如果你让现在使用这些类,你就会有一些重构,当你升级到休眠4.做
SteveT

18

为了我的钱,使用没有问题HibernateDaoSupport。在Spring 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-我仍然更喜欢HibernateDaoSupportHibernateTemplate,因为它们提供了比原始Hibernate SessionAPI更丰富的API。
skaffman 2011年

感谢您提供有关@Repository批注的提示,我当然会在文档中找到更多有关它的提示。很抱歉,我找不到我第一次看到此提及的主题。
C0deAttack

@skaffman好,如果Hibernate的API不好,那么也许不应该使用Hibernate(我仅将其用作JPA提供程序)
肖恩·帕特里克·弗洛伊德

@Sean:我并不是说这是一个不好的API。只是春天的天气好一点。
skaffman 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.