为啥不推荐 HibernateDaoSupport?

Posted

技术标签:

【中文标题】为啥不推荐 HibernateDaoSupport?【英文标题】:Why is HibernateDaoSupport not recommended?为什么不推荐 HibernateDaoSupport? 【发布时间】:2011-07-03 13:11:49 【问题描述】:

我最近一直在使用 Hibernate 3.5 和 Spring 3,我对 Hibernate 还很陌生,并认为 Spring 中的 HibernateDaoSupport 类使得在我的域类中使用 Hibernate 变得既好又容易。

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

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

【问题讨论】:

【参考方案1】:

不推荐使用HibernateDaoSupport/HibernateTemplate,因为它没有必要 将您的代码与 Spring 类联系起来。

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

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

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

另请参阅:

13.3.2 Implementing DAOs based on plain Hibernate 3 API

【讨论】:

感谢您的意见。感谢 Spring 文档的链接,实际上很清楚。我会将您的帖子标记为答案,因为它回答了我的主要问题,谢谢。 替代SessionFactory,您可以使用Hibernate 的JPA 2 实现(注入EntityManager 作为起点)。 重要的是要注意 Spring 已经从他们的 Hibernate 4 包中删除了 HibernateDaoSupport/HibernateTemplate。因此,如果您现在使用这些类,当您升级到 Hibernate 4 时,您将需要进行一些重构。【参考方案2】:

在我看来,使用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);
    

【讨论】:

+1 - 我仍然更喜欢 HibernateDaoSupportHibernateTemplate,因为它们提供了比原始 Hibernate Session API 更丰富的 API。 感谢您提供有关 @Repository 注释的提示,我一定会在文档中找到更多相关信息。抱歉,我找不到第一次看到此内容的主题。 @skaffman 如果 Hibernate 有一个糟糕的 API,那么也许不应该使用 Hibernate(我只将它用作 JPA 提供程序) @Sean:我没有说这是一个糟糕的 API。只是Spring的稍微好一点。

以上是关于为啥不推荐 HibernateDaoSupport?的主要内容,如果未能解决你的问题,请参考以下文章

HibernateDaoSupport类的使用

JavaWeb学习之HibernateDaoSupport使用

JavaWeb学习之HibernateDaoSupport使用

不推荐使用的休眠 getSession().connection() 的替代方案

求对hibernate源码了解的大神!关于hibernate4及以上版本---不配置事务,dao类继承自HibernateDaoSupport

我的Dao层