spring 手動實現aop管理事務

jopen 12年前發布 | 41K 次閱讀 Spring JEE框架

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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!