Spring 集成 hibernate 的事务管理,不用我们手动开启和提交事务了:
需要在xml文件头部的 xsi:schemaLocation 添加:
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
hibernate 配置文件中可设的配置:
hibernate.current_session_context_class=org.springframework.orm.hibernate3.SpringSessionContext
此为默认值,可不设
aop 的设置:
<bean id="transaction_manager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"> </property> </bean> <tx:advice id="muser_txAdvice" transaction-manager="transaction_manager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <bean id="muser_inter" class="org.aops.MuserAdvice"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <aop:config> <aop:pointcut expression="execution(* org.services.impl.MuserServiceImpl.login(String, String))" id="login_pointCut" /> <aop:advisor advice-ref="muser_inter" pointcut-ref="login_pointCut" /> <aop:advisor advice-ref="muser_txAdvice" pointcut-ref="login_pointCut" /> </aop:config>
java 中的代码:
package org.aops;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.hibernate.SessionFactory;
public class MuserAdvice implements MethodInterceptor {
private SessionFactory sessionFactory;
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("in");
Object obj = arg0.proceed();
System.out.println("out");
return obj;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
控制台的输出:
in
Hibernate:
select
muser0_.MUID as MUID1_,
muser0_.MUNAME as MUNAME1_,
muser0_.MUPWD as MUPWD1_
from
TEST.MUSER muser0_
where
muser0_.MUNAME=?
and muser0_.MUPWD=?
out