spring 手動實現aop管理事務
1.事務的使用:
每次對數據庫操作我們都要beginTransaction,顯然是不行的.
(比如一個業務中多次操作數據庫,但是當某個方法出錯或是..我們需要回滾,但是每次操作我們都提交了;整體回滾不了,
所以我們有些只能把它們綁定使用一個事務)
2.手動實現aop管理事務:
利用aop around環繞攔截。攔截方法(service中的一個業務方法)之前開啟事務,之后再關閉;
package org.ymm.aops; import org.aspectj.lang.ProceedingJoinPoint; import org.hibernate.SessionFactory; import org.ymm.entity.Users; public class LoginAdvice { public SessionFactory sf; public SessionFactory getSf() { return sf; } public void setSf(SessionFactory sf) { this.sf = sf; } public Object around1(ProceedingJoinPoint pjp) throws Throwable{ this.sf.getCurrentSession().beginTransaction(); Object o = pjp.proceed(); this.sf.getCurrentSession().getTransaction().commit(); return o; } }
sf 是spring接管hibernate的SessionFactory
<bean id="L_a" class="org.ymm.aops.LoginAdvice" > <property name="sf" ref="sFactory"></property> </bean> <aop:config> <aop:pointcut expression="execution(* org.ymm.services.LoginService.Login(..))" id="lg"/> <aop:aspect ref="L_a" id="my_la"> <aop:around method="around1" pointcut-ref="lg"/> </aop:aspect> </aop:config>
services中被切的方法
package org.ymm.services; import org.ymm.dao.IUsersDao; import org.ymm.entity.Users; public class LoginService implements ILoginService{ public IUsersDao ud; public IUsersDao getUd() { return ud; } public void setUd(IUsersDao ud) { this.ud = ud; } public Users Login(String uname){ ud.getAllUsers();//aop切面管理事務 只是為了測試兩個查詢都用同一個事務 return ud.findUserByUname(uname); } }
方法中我們就不需開啟事務
public Users findUserByUname(String uname) { // TODO Auto-generated method stub Session session= sf.getCurrentSession(); /*session.beginTransaction();*/ List<Users> list= session.createSQLQuery("select u.*,1 from users u where u.uname='"+uname+"'") .addEntity(Users.class).list(); Users user=(Users)(list.get(0)); return user; }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!