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