歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring 手動實現aop管理事務

1.事務的使用:

每次對數據庫操作我們都要beginTransaction,顯然是不行的.

(比如一個業務中多次操作數據庫,但是當某個方法出錯或是..我們需要回滾,但是每次操作我們都提交了;整體回滾不了,

所以我們有些只能把它們綁定使用一個事務)


 2.手動實現aop管理事務:

利用aop around環繞攔截。攔截方法(service中的一個業務方法)之前開啟事務,之後再關閉;

  1. package org.ymm.aops;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.hibernate.SessionFactory;  
  5. import org.ymm.entity.Users;  
  6.   
  7. public class LoginAdvice {  
  8.       
  9.     public SessionFactory sf;  
  10.       
  11.     public SessionFactory getSf() {  
  12.         return sf;  
  13.     }  
  14.   
  15.     public void setSf(SessionFactory sf) {  
  16.         this.sf = sf;  
  17.     }  
  18.   
  19.     public Object around1(ProceedingJoinPoint pjp) throws Throwable{  
  20.         this.sf.getCurrentSession().beginTransaction();  
  21.         Object o = pjp.proceed();  
  22.         this.sf.getCurrentSession().getTransaction().commit();  
  23.         return o;  
  24.     }  
  25. }  

sf 是spring接管hibernate的SessionFactory

  1. <bean id="L_a" class="org.ymm.aops.LoginAdvice" >  
  2.         <property name="sf" ref="sFactory"></property>  
  3.      </bean>  
  4.               
  5.     <aop:config>  
  6.         <aop:pointcut expression="execution(* org.ymm.services.LoginService.Login(..))" id="lg"/>  
  7.       
  8.         <aop:aspect ref="L_a" id="my_la">  
  9.             <aop:around method="around1" pointcut-ref="lg"/>  
  10.         </aop:aspect>  
  11.     </aop:config>  

services中被切的方法

  1. package org.ymm.services;  
  2.   
  3. import org.ymm.dao.IUsersDao;  
  4. import org.ymm.entity.Users;  
  5.   
  6. public class LoginService implements ILoginService{  
  7.       
  8.     public IUsersDao ud;  
  9.       
  10.     public IUsersDao getUd() {  
  11.         return ud;  
  12.     }  
  13.   
  14.     public void setUd(IUsersDao ud) {  
  15.         this.ud = ud;  
  16.     }  
  17.   
  18.     public Users Login(String uname){  
  19.         ud.getAllUsers();//aop切面管理事務 只是為了測試兩個查詢都用同一個事務   
  20.         return ud.findUserByUname(uname);  
  21.     }  
  22. }  

方法中我們就不需開啟事務

  1. public Users findUserByUname(String uname) {  
  2.         // TODO Auto-generated method stub   
  3.         Session session= sf.getCurrentSession();  
  4.         /*session.beginTransaction();*/  
  5.         List<Users> list= session.createSQLQuery("select u.*,1 from users  u where u.uname='"+uname+"'")  
  6.                 .addEntity(Users.class).list();  
  7.         Users user=(Users)(list.get(0));  
  8.         return user;  
  9.     }  
Copyright © Linux教程網 All Rights Reserved