ITEEDU

Hibernate 编程事务管理

Hibernate提供有自己的事务管理实现,然而在使用Spring整合Hibernate时,建议将事务管理交由 Spring来负责,您可以使用编程式的事务管理,方法与第 5 章中直接使用JDBC进行编程式的事务 管理类似,例如可将 HibernateTemplate 中的UserDAO类别加以改写,使之具有事务管理功能。

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