Sping 学习笔记8——SSH框架中事务的声明与配置
来源:互联网 发布:log4j flume源码 编辑:程序博客网 时间:2024/05/22 16:45
声明式事务管理
Spring的声明式事务管理,是通过Spring AOP实现的。
Spring事务类型:
配置
Spring关于事务配置包含3部分:
- DataSource
- TransactionManager
- 代理机制
在使用Hibernate时:
DataSource的实现为SessionFactory,
TransactionManager的实现为HibernateTransactionManager。
公共配置
<!-- 配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="configLocation"> <value>classpath:config/hibernate.cfg.xml</value> </property> <property name="packagesToScan"> <list> <value>com.entity</value> </list> </property> </bean> <!-- 配置事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置DAO --> <bean id="userDao" class="com.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property></bean>
方法1 使用tx标签
<!-- 第一种配置事务的方式 ,tx--> <tx:advice id="txadvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception" /> <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/> <tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/> <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/> </aop:config>
方法2 使用代理方式
<!-- 第二种配置事务的方式 ,代理--> <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="modify*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="del*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="*">PROPAGATION_REQUIRED, readOnly</prop> </props> </property> </bean> <bean id="userDao" parent="transactionProxy"> <property name="target"> <!-- 用bean代替ref的方式--> <bean class="com.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </property> </bean>
将transactionProxy的abstract属性设置为”true”,然后将具体的Dao的parent属性设置为”transactionProxy”,可以精简代码。
方法3 使用拦截器
<!-- 第三种配置事务的方式,拦截器 (比较老的方式,不常用)--> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="modify*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="del*">PROPAGATION_REQUIRED, -Exception</prop> <prop key="*">PROPAGATION_REQUIRED, readOnly</prop> </props> </property> </bean> <bean id="proxyFactory" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> <property name="beanNames"> <list> <value>*Dao</value> </list> </property> </bean>
方法4 注解方式,不适合较大的项目
<!--开启注解方式,必须的--> <context:annotation-config /><!--注解扫描--><context:component-scan base-package="com.bluesky" /><tx:annotation-driven transaction-manager="transactionManager"/> <!-- 配置sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="configLocation"> <value>classpath:config/hibernate.cfg.xml</value> </property> <!-- 扫描包位置配置在bean属性内 <property name="packagesToScan"> <list> <value>com.entity</value> </list> </property> --></bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
下面要在dao上加下@Transactional注解(同时在继承过来父类的baseDao也要注解)。
注解文件示例
package com.dao; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.entity.User; @Transactional public class UserDaoImpl_BAK extends HibernateTemplate { @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception") public void addUser(User user) throws Exception { this.save(user); } @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception") public void modifyUser(User user) { this.update(user); } @Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception") public void delUser(String username) { this.delete(this.load(User.class, username)); } @Transactional(readOnly=true) public void selectUser() { } }
使用注解时,可能编译器会提示:
advised by org.springframework.transaction.interceptor.TransactionInterceptor.invoke(org.aopalliance.intercept.MethodInvocation)
可修改如下:
<context:component-scan base-package="我的包名" use-default-filters="false"></context:component-scan>
说明
如下方式可以成功扫描到@Controller注解的Bean,不会扫描@Service/@Repository的Bean。
<context:component-scan base-package="org.bdp.system.test.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
如下方式,不仅仅扫描@Controller,还扫描@Service/@Repository的Bean:
<context:component-scan base-package="org.bdp"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
这个尤其在springmvc+spring+hibernate等集成时最容易出问题的地,最典型的错误就是:事务不起作用。
参考:
http://blog.csdn.net/liushuijinger/article/details/17364413
http://jinnianshilongnian.iteye.com/blog/1762632
阅读全文
0 0
- Sping 学习笔记8——SSH框架中事务的声明与配置
- ssh框架中事务的声明和两种配置事务的方法
- sping配置声明式事务
- SSH整合配置声明事务的步骤
- Java Web开发中Sping的总结和SSH配置
- Java Web开发中Sping的总结和SSH配置
- Java Web开发中Sping的总结和SSH配置
- SSH与SSM学习之Spring22——Spring事务之xml配置方式管理事务
- SSH与SSM学习之Spring23——Spring事务之注解配置方式管理事务
- SHS框架中声明事务的代码
- Sping 学习笔记7—— SpringMVC的restful 服务
- sping 配置数据源、事务。
- sping事务配置
- spring学习笔记(21)——声明式事务
- Sping中Quartz的配置
- Sping中Quartz的配置
- SSH与SSM学习之SSH整合09——Spring的aop事务
- SSH整合(三)——Spring声明式事务配置
- sql server 存储过程 中处理json
- android 如何解析复杂的json数据
- 安卓获取adb设备名称
- opencv检测直线方法——形态学方法
- apollo简单使用
- Sping 学习笔记8——SSH框架中事务的声明与配置
- Ubuntu 16.4 默认安装的mysql 修改默认编码
- Android MediaPlayer的生命周期
- Android开发艺术探究(一):Activity的生命周期和启动模式
- js
- Python 面向对象
- 机器学习笔记:tensorflow实现卷积神经网络经典案例--识别手写数字
- EasyNVR H5无插件直播方案前端构建之:如何区分PC端和移动端
- 快速可靠网络传输协议 KCP详解