为什么不推荐HibernateDaoSupport?

为什么不推荐HibernateDaoSupport?,hibernate,spring,Hibernate,Spring,最近我一直在用Hibernate 3.5和Spring 3做一些工作,我对Hibernate还比较陌生,我认为Spring中的HibernateDaoSupport类使Hibernate与我的域类一起使用非常方便 然而,在搜索一个不相关的问题时,我看到有人提到HibernateDaoSupport不是使用Spring和Hibernate的最佳方式。有谁能解释一下: 为什么不推荐呢 集成Hibernate和Spring的最佳(或至少是公认的)方法是什么 用我的钱来说,使用HibernateDao

最近我一直在用Hibernate 3.5和Spring 3做一些工作,我对Hibernate还比较陌生,我认为Spring中的
HibernateDaoSupport
类使Hibernate与我的域类一起使用非常方便

然而,在搜索一个不相关的问题时,我看到有人提到
HibernateDaoSupport
不是使用Spring和Hibernate的最佳方式。有谁能解释一下:

  • 为什么不推荐呢
  • 集成Hibernate和Spring的最佳(或至少是公认的)方法是什么

用我的钱来说,使用
HibernateDaoSupport
没有什么错。它在Spring3.0中没有被弃用

你能提供你找到的问题编号吗?也许他们指的是一个非常具体的用例

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

@Repository
public class YourFooDao {

    @Resource
    private SessionFactory sessionFactory;

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

不建议使用
HibernateDaoSupport
/
HibernateTemplate
,因为这是不必要的 将代码绑定到Spring类

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

然而,由于Hibernate 3.0.1,您不再需要它了——您可以在使用Spring管理的事务时针对普通的Hibernate API编写代码。您只需配置Spring事务支持,在需要使用会话时,插入
SessionFactory
并调用
getCurrentSession()

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

另请参见:


+1-我仍然更喜欢
HibernateDaoSupport
HibernateTemplate
,因为它们提供了比原始Hibernate
会话更丰富的API。感谢@Repository注释的提示,我一定会在文档中找到更多关于它的信息。我找不到我第一次看到这一点的线程,对不起。@skaffman如果Hibernate有一个坏的API,那么可能不应该使用Hibernate(我只使用它作为JPA提供程序)@Sean:我没有说它是一个坏的API。只是Spring的情况稍微好一点。谢谢你的意见。谢谢你给Spring doc的链接,事实上这很清楚。我将把你的帖子标记为答案,因为它回答了我的主要问题,谢谢。除了
SessionFactory
之外,你还可以使用Hibernate的JPA 2实现(注入
EntityManager
作为起点)。需要注意的是,Spring已经从Hibernate 4包中删除了HibernateAOSupport/HibernateTemplate。因此,如果您现在使用这些类,那么当您升级到Hibernate4时,您将需要进行一些重构。