Hibernate提供有自己的事务管理实现,然而在使用Spring整合Hibernate时,建议将事务管理交由 Spring来负责,您可以使用编程式的事务管理,方法与第 5 章中直接使用JDBC进行编程式的事务 管理类似,例如可将 HibernateTemplate 中的UserDAO类别加以改写,使之具有事务管理功能。
package onlyfun.caterpillar; import org.hibernate.SessionFactory; import org.springframework.dao.DataAccessException; import org.springframework.orm. hibernate3.HibernateTemplate; import org.springframework. transaction.TransactionDefinition; import org.springframework. transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction. support.TransactionTemplate; import org.springframework.orm. hibernate3.HibernateTransactionManager; public class UserDAO implements IUserDAO { private TransactionTemplate transactionTemplate; private HibernateTemplate hibernateTemplate; public void setSessionFactory( SessionFactory sessionFactory) { this.transactionTemplate =new TransactionTemplate( new HibernateTransactionManager(sessionFactory)); this.hibernateTemplate =new HibernateTemplate(sessionFactory); } public void insert(User user) { final User userData = user; // 设定传播行为 transactionTemplate.setPropagationBehavior( TransactionDefinition.PROPAGATION_REQUIRED); transactionTemplate.execute( new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult( TransactionStatus status) { try { hibernateTemplate.save(userData); } catch(DataAccessException e) { e.printStackTrace(); status.setRollbackOnly(); } } }); } public User find(Integer id) { User user =(User) hibernateTemplate.get(User.class, id); return user; } }
org.springframework.transaction.support.TransactionTemplate 类别在建立时,需 要一个实作 PlatformTransactionManager 的 实 例 , 这 边 使 用 的 是 org.springframework.orm.hibernate3.HibernateTransactionManager 类 别 来 建 立 实 例 , TransactionTemplate 必须设定传播行为(Propagation Behavior)、并使用 Callback 物件来执行事务, 在发生例外时,使用 TransactionStatus 撤消操作,您可以参考一下 Spring 参考手册来了解一些细 节说明。