为啥不推荐 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 的最佳方式。任何人都可以阐明:
【问题讨论】:
【参考方案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 - 我仍然更喜欢HibernateDaoSupport
和 HibernateTemplate
,因为它们提供了比原始 Hibernate Session
API 更丰富的 API。
感谢您提供有关 @Repository 注释的提示,我一定会在文档中找到更多相关信息。抱歉,我找不到第一次看到此内容的主题。
@skaffman 如果 Hibernate 有一个糟糕的 API,那么也许不应该使用 Hibernate(我只将它用作 JPA 提供程序)
@Sean:我没有说这是一个糟糕的 API。只是Spring的稍微好一点。以上是关于为啥不推荐 HibernateDaoSupport?的主要内容,如果未能解决你的问题,请参考以下文章
JavaWeb学习之HibernateDaoSupport使用
JavaWeb学习之HibernateDaoSupport使用
不推荐使用的休眠 getSession().connection() 的替代方案
求对hibernate源码了解的大神!关于hibernate4及以上版本---不配置事务,dao类继承自HibernateDaoSupport