1. 程式人生 > >8.Spring整合Hibernate_2_聲明式的事務管理(Annotation的方式)

8.Spring整合Hibernate_2_聲明式的事務管理(Annotation的方式)

之一 為什麽 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         <property 
name="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 ,即在方法的執行前後,加上事務開啟 和 事務關閉語句,如果發現了 運行時異常,就會rollback
3 //為什麽在這裏事務管理要放到 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的方式)