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 参考手册来了解一些细 节说明。