8.Spring整合Hibernate_2_聲明式的事務管理(Annotation的方式)
阿新 • • 發佈:2017-08-20
之一 為什麽 runtime span nal not 方法 int action
聲明式的事務管理(AOP的主要用途之一) (Annotation的方式)
1.加入annotation.xsd
2.加入txManager bean
3.<tx:annotation-driven
1 <tx:annotation-driven transaction-manager="txManager"/> 2 <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 3 <propertyname="sessionFactory" ref="sessionFactory"/> 4 </bean>
4.在需要的事務的方法上加 : @Transactional
[email protected]
1.被註解的方法只有在拋出 運行時異常才會觸發rollback,非運行時異常不會rollback
2.不管什麽異常,只要你catch了,spring就會放棄管理
3.事務的傳播特性 propagation_required
例如:@Transactional(propagation = Propagation.REQUIRED) 等同於(@Transactional)
作用:[email protected],[email protected]
4.read_only
例如:@Transactional(propagation = Propagation.REQUIRED,readOnly=true)
當方法聲明為 readOnly = true 時,該方法及其調用的方法內都不執行 insert update等
1 //使用 @Transactional 註解 ,聲明 需要進行事務管理的方法 2 //事務管理,同樣體現了 AOP ,即在方法的執行前後,加上事務開啟 和 事務關閉語句,如果發現了 運行時異常,就會rollback3 //為什麽在這裏事務管理要放到 Service層,不放到DAO層:1.因為該add方法牽扯到了多個DAO,裏面有setMsg方法 和 save方法,要保證這兩個方法 ‘榮辱與共’ 4 //所以 service 的 add 方法需要 進行事務管理, 5 //如果 add 方法中,只用到了一個DAO,那麽只需要在 該 DAO 需要 進行事務管理的方法上進行 管理即可 6 7 //事務的傳播特性: 8 //@Transactional(propagation=Propagation.REQUIRED) == (@Transactional) 9 //一個方法聲明了 @Transactional 事務後,其內再調用的方法不需要再聲明 @Transactional 10 //別人調 add 方法,如果這個add方法之前 ,如果說已經有了一個 transaction,就用原來那個,如果沒有(在UserService中沒有事務),就創建一個新的(即需要(required)的時候才創建) 11 12 //read_only 13 //當方法聲明 readOnly=true時,就產生一個 只讀 的 connection ,當方法內部只有讀取的業務時,可以使用,提高性能 14 15 @Transactional(propagation=Propagation.REQUIRED,readOnly=true) 16 public void add(User user) { 17 Log log = new Log(); 18 log.setMsg("logmsg"); 19 logDAO.saveMsg(log); 20 userDAO.save(user); 21 }
5.需要註意,使用事務後,Hibernate 獲得 session時要使用getCurrentSession,不能使用openSession
為什麽?:使用事務後,不能使用openSession,否則可能會創建一個新的session,無法保證和後面的方法是在同一個事務中
1 @Component("userDAO") 2 public class UserDAOImpl implements UserDAO{ 3 private SessionFactory sessionFactory; 4 5 public SessionFactory getSessionFactory() { 6 return sessionFactory; 7 } 8 9 //在DAO中 註入 setSessionFactory 10 @Resource 11 public void setSessionFactory(SessionFactory sessionFactory) { 12 this.sessionFactory = sessionFactory; 13 } 14 15 @Override 16 public void save(User user) { 17 //註:使用事務後,不能使用 openSession,否則會 創建一個 新的session,無法保證和後面的方法是在同一事務中 18 19 Session session = sessionFactory.getCurrentSession(); 20 session.save(user); 21 System.out.println(sessionFactory.getClass()); 22 System.out.println("a user saved"); 23 24 //1.運行期異常,非運行期異常不會觸發rollback 25 throw new RuntimeException("1"); 26 } 27 28 29 }
8.Spring整合Hibernate_2_聲明式的事務管理(Annotation的方式)