歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring 手動實現aop管理事務

Spring 手動實現aop管理事務

日期:2017/3/1 10:18:16   编辑:Linux編程

1.事務的使用:

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

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

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


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

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

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

sf 是spring接管hibernate的SessionFactory

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

services中被切的方法

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

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

  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