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參考手冊來了解一些細節說明。