【问题标题】: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 的最佳(或至少是公认的)方法是什么?

【问题讨论】:

    标签: hibernate spring


    【解决方案1】:

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

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

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

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

    另请参阅:

    【讨论】:

    • 感谢您的意见。感谢 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的稍微好一点。
    猜你喜欢
    • 2012-05-31
    • 2017-02-21
    • 1970-01-01
    • 2016-02-23
    • 2017-11-04
    • 2011-10-22
    • 2011-04-11
    • 2021-10-12
    • 2012-12-07
    相关资源
    最近更新 更多