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;
- }