spring的aop事务
一、准备工作
applicationContext.xml:
<!-- 核心事务管理器 --> <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" > <property name="sessionFactory" ref="sessionFactory" ></property> </bean>
二、方式一:xml配置aop事务
2.1 配置通知
applicationContext.xml:
<!-- 配置通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager" > <tx:attributes> <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" /> <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice>
2.2 配置织入
applicationContext.xml:
<!-- 配置将通知织入目标对象 --> <aop:config> <!-- 配置切点 --> <aop:pointcut expression="execution(* cn.itcast.service.impl.*ServiceImpl.*(..))" id="txPc"/> <!-- 配置切面 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" /> </aop:config>
三、方式二:注解配置aop事务
3.1 开启注解事务
applicationContext.xml:
<!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" />
3.2 Service类中使用注解
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true) public class UserServiceImpl implements UserService{ private UserDao ud; @Override public User getUserByCodePassword(User u) { //1 根据登陆名称查询登陆用户 User existU = ud.getByUserCode(u.getUser_code()); //2 判断用户是否存在.不存在=>抛出异常,提示用户名不存在 if(existU==null){ throw new RuntimeException("用户名不存在!"); } //3 判断用户密码是否正确=>不正确=>抛出异常,提示密码错误 if(!existU.getUser_password().equals(u.getUser_password())){ throw new RuntimeException("密码错误!"); } //4 返回查询到的用户对象 return existU; } @Override @Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false) public void saveUser(User u) { ud.save(u); } public void setUd(UserDao ud) { this.ud = ud; } }
扩大session作用范围
一、为了避免使用懒加载时出现no-session问题,需要扩大session的作用范围
二、配置filter
web.xml:
<!-- 扩大session作用范围 注意: 任何filter一定要在struts的filter之前调用 --> <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <!-- struts2核心过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>