为什么不建议使用HibernateDaoSupport?

C0d*_*ack 68 spring hibernate

我最近在Hibernate 3.5和Spring 3上做过一些工作,我对Hibernate很新,并且认为HibernateDaoSupportSpring中的类使我的域类很好用,也很容易使用Hibernate.

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

  • 为什么不推荐?
  • 集成Hibernate和Spring的最佳(或至少是被接受的)方式是什么?

axt*_*avt 91

建议不要使用HibernateDaoSupport/,HibernateTemplate因为它会不必要地将您的代码绑定到Spring类.

对于旧版本的Hibernate,使用这些类是不可避免的,以便集成对Spring管理的事务的支持.

但是,由于Hibernate 3.0.1你不再需要它 - 你可以在使用Spring管理的事务时针对普通的Hibernate API编写代码.您只需配置Spring事务支持,在需要使用会话时注入SessionFactory并调用getCurrentSession()它.

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

也可以看看:

  • 值得注意的是,Spring已经从Hibernate 4软件包中删除了HibernateDaoSupport/HibernateTemplate.因此,如果您现在使用这些类,那么在升级到Hibernate 4时,您将需要进行一些重构. (5认同)

Gar*_*vis 18

对于我的钱,使用没有任何问题HibernateDaoSupport.它在3.0版本中不被弃用.

您能否提供您找到的问题编号,也许它们可以引用一个非常具体的用例.

另一种方法是使用@Repository注释.这将连接相同的异常转换(这是一个很大的好处HibernateTemplate),并允许您使用自己的超类或只是为了避免扩展第三方框架类.

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

    private Foo get(long id){
        return (Foo) sessionFactory.getCurrentSession().get(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1 - 我仍然更喜欢`HibernateDaoSupport`和`HibernateTemplate`,因为它们提供了比原始Hibernate`Assse` API更丰富的API. (4认同)