使用Hibernate和SQL最佳实践的Spring事务

时间:2011-11-24 10:27:44

标签: mysql hibernate spring spring-transactions

我们目前正在使用Spring MVC来实现REST Web服务。我们现在想要实现某种数据持久性,我正在研究选项是什么。 Spring Transactions + Hibernate + MySQL似乎是一种非常流行的方法,但我所看到的每一篇博客/教程都有不同的看法。

任何人都可以指导我使用Spring进行数据持久性的“最佳实践”吗?我想基于它进行注释,因为这对我来说似乎更自然和可维护。

但是现在在某些地方我已经读过HibernateTemplate不应再使用了。有些人使用* Dao界面和* DaoImpl与@Repository方法,而其他人使用* Service与@Service方法。

提前感谢任何建议。

3 个答案:

答案 0 :(得分:4)

HibernateTemplate确实不是很有用,Spring文档建议不再使用它。

@Repository和@Service基本上做同样的事情,除了(AFAIK)两件事:

  • @Repository明确表示该服务是DAO,而不是业务服务
  • 从@Repository注释服务抛出的异常被转换为Spring的持久性异常类。这意味着你不会得到Hibernate异常,而是包含Hibernate异常的Spring异常。

答案 1 :(得分:1)

当hibernate不支持每个线程有一个会话的概念时,需要Hibernate Template。现在更好的方法是直接在SessionFactory上使用getCurrentSession方法。

使用HibernateTemplate的另一个问题是,如果在SessionFactory上暴露出更新的api,那么必须等待新版本的Hibernate Template支持它。

简而言之,直接使用SessionFactory

答案 2 :(得分:0)

HibernateTemplate文档中不鼓励使用HibernateTemplate

http://static.springsource.org/spring/docs/2.0.3/api/org/springframework/orm/hibernate3/HibernateTemplate.html

  

注意:从Hibernate 3.0.1开始,事务性Hibernate访问代码也可以用简单的Hibernate风格编码。因此,对于新启动的项目,请考虑采用基于SessionFactory.getCurrentSession()的标准Hibernate3样式的编码数据访问对象。 (Spring的LocalSessionFactoryBean自动支持Hibernate3 getCurrentSession()方法的Spring事务管理。)

@ Repository或@Service的使用没有任何区别,但我相信这些注释将来会有更多的DAO /服务级别支持,这将使它们的使用更加精确。

我个人更喜欢使用DAO层中的@Repository来划分我的服务和业务层。