Spring MVC 事务配置
Spring MVC事务配置
要了解事务配置的所有方法,请看一下《Spring事务配置的5种方法》
本文介绍两种配置方法:
一、 XML,使用tx标签配置拦截器实现事务
一、 Annotation方式
以下所使用环境为Spring4.0.3、Hibernate4.3.5
一、 XML,使用tx标签配置拦截器实现事务
Entity类User.java,持久化类,对应数据库表user
package com.lei.demo.entity;import javax.persistence.*;@Entity(name="users") public class Users {public Users(){super();}@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="id")private Integer id;@Column(name="user_name",length=32)private String user_name;@Column(name="age")private Integer age;@Column(name="nice_name",length=32)private String nice_name;//属性实现...... }
UserDAO.javar,表user的一些操作,其中属性sessionFactory应该由Spring注入,如下:
package com.lei.demo.dao;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository;import com.lei.demo.entity.Users;public class UsersDAO {private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}public SessionFactory getSessionFactory() {return sessionFactory;}public List<Users> getAllUser(){String hsql="from users";Session session = sessionFactory.getCurrentSession();Query query = session.createQuery(hsql);return query.list();} }
UserService.java,业务实现类,如下
package com.lei.demo.service;import javax.annotation.Resource;import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.lei.demo.dao.*;public class UserService {private UsersDAO userDao;public int userCount(){return userDao.getAllUser().size();}public UsersDAO getUserDao() {return userDao;}public void setUserDao(UsersDAO userDao) {this.userDao = userDao;}}
首先看一下xml配置,spring-hibernate.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><!-- Hibernate4 --><!-- 加载资源文件 其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载--><context:property-placeholder location="classpath:persistence-mysql.properties" /><bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="packagesToScan"><list><!-- 可以加多个包 --><value>com.lei.demo.entity</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><!-- <prop key="hibernate.current_session_context_class">thread</prop> --> </props></property></bean><!-- 数据库映射 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.user}" /><property name="password" value="${jdbc.pass}" /></bean><!-- 配置Hibernate事务管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 配置事务异常封装 --><bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /><!-- 声明式容器事务管理 ,transaction-manager指定事务管理器为transactionManager --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED" /><tx:method name="get*" propagation="REQUIRED" /><tx:method name="*" read-only="true" /></tx:attributes></tx:advice><aop:config expose-proxy="true"><!-- 只对业务逻辑层实施事务 --><aop:pointcut id="txPointcut" expression="execution(* com.lei.demo.service..*.*(..))" /><!-- Advisor定义,切入点和通知分别为txPointcut、txAdvice --><aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/></aop:config></beans>
其中主要配置中是tx:advice和aop:config两个配置节,以Spring AOP的方式实现事务管理。
tx:advice配置了事务的管理者是transactionManager,同时tx:method也规定了如果方法名匹配“add*”和“get*”方法时使用事务,propagation是设定事务的传播级别。除了“add*”和“get*”方法,其他的方法的事务是只读的(典型地,对于只执行查询的事务你会将该属性设为true,如果出现了更新、插入或是删除语句时只读事务就会失败)
aop:config指定了一个aop:pointcut去引用上边的advice。
这样就通过AOP的拦截机制实现了事务,当然你还要用Spring的方式自己配置UserDAO和UserService。
二、 Annotation方式
第一步,首先看一下web.xml,如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"><display-name>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:/spring-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>lei-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:/lei-dispatcher-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>lei-dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>
第二步,spring-hibernate配置,见以下spring-hibernate.xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><!-- Hibernate4 --><!-- 加载资源文件 其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载--><context:property-placeholder location="classpath:persistence-mysql.properties" /><bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="packagesToScan"><list><!-- 可以加多个包 --><value>com.lei.demo.entity</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><!-- <prop key="hibernate.current_session_context_class">thread</prop> --> </props></property></bean><!-- 数据库映射 --><!-- class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" --><!-- class="org.springframework.jdbc.datasource.DriverManagerDataSource" --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.user}" /><property name="password" value="${jdbc.pass}" /></bean><!-- 配置Hibernate事务管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 配置事务异常封装 --><bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /></beans>
第一节中xml配置事务中需要通过配置tx:advice和aop:config来增加事务的功能。此处采用全注释方法,这两个配置节就不需要了。
相应的需要在视图解析配置中启用注释,如下lei-dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><!-- 启动自动扫描 该包下所有的Bean(@Controller) --><context:component-scan base-package="com.lei.demo" /><!-- 基于注释的事务,当注释中发现@Transactional时,使用id为“transactionManager”的事务管理器 --><!-- 如果没有设置transaction-manager的值,则spring以缺省默认的事务管理器来处理事务,默认事务管理器为第一个加载的事务管理器 --><tx:annotation-driven transaction-manager="transactionManager"/><!-- 定义视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix"><value>/WEB-INF/user/</value></property><property name="suffix"><value>.jsp</value></property></bean></beans>
UserDAO如下
package com.lei.demo.dao;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository;import com.lei.demo.entity.Users;@Repository public class UsersDAO {@Resource(name="sessionFactory")private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}public SessionFactory getSessionFactory() {return sessionFactory;}public List<Users> getAllUser(){String hsql="from users";Session session = sessionFactory.getCurrentSession();Query query = session.createQuery(hsql);return query.list();} }
UserService.java如下
package com.lei.demo.service;import javax.annotation.Resource;import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;import com.lei.demo.dao.*;@Service("userService") public class UserService {@Resourceprivate UsersDAO userDao;@Transactionalpublic int userCount(){return userDao.getAllUser().size();}public UsersDAO getUserDao() {return userDao;}public void setUserDao(UsersDAO userDao) {this.userDao = userDao;}}
这里,方法名userCount上加入@Transactional,说明这个方法要启用事务。如果类名UserService上加入@Transactional,则表明这个类中的所有方法都会启用事务。
如果配有多个transactionManager,例如配置有transactionManager1,和transactionManager2,则可以通过@Transactional(“transactionManager1”),的方式指定使用哪个数据源的事务。
源代码下载:
http://www.oschina.net/code/snippet_1764868_35775
友情赞助
如果您喜欢此文,感觉对您工作有帮助,预期领导会给您涨工资,不妨小额赞助一下,让我有动力继续努力。
赞助方式1:打开支付宝App,使用“扫一扫”付款,付款码见下图,别忘了付款留言哦!
赞助方式2:支付宝扫一下,领取我的的大红包,并花掉,双方受益
赞助方式3: 如果您有微信钱包,请打开微信,使用“扫一扫”付款,付款码见下图
转载请注明出处!
Spring MVC 事务配置相关推荐
- java中mvc事务_Spring MVC 事务配置
Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 以下所使用环境为Spring4.0.3.Hibernate4.3 ...
- spring mvc mysql配置_spring mvc配置数据库连接
ACM 配置中心实战:Spring + MyBatis + Druid + ACM 很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid 是一个黄金 ...
- Spring boot的Spring MVC自动配置原理
Spring MVC自动配置 搜索WebMvcAutoConfiguration 查询ContentNegotiatingViewResolver ContentNegotiatingViewReso ...
- Servlet 3 + Spring MVC零配置:去除所有xml
在一些基于Spring/Spring MVC的Java Web项目中,总是会有一些xml配置文件,如web.xml.applicationContext.xml等,本文的目标即消灭这些xml配置文件, ...
- spring mvc事务没有生效的原因
spring-mvc事务配置如下 <tx:advice id="transactionAdvice" transaction-manager="transactio ...
- spring中事务配置的3种方式-2
http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch09s05.html http://zpchen.iteye.com/blog/ ...
- Spring MVC零配置(全注解)(版本5.0.7)
// 核心配置类 package spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConf ...
- Spring boot的Spring MVC自动配置
自动配置 参考官网 https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features ...
- 【spring学习笔记】(二)Spring MVC注解配置 参数转换注解@RequestMapping@RequestParam、@PathVariable@MatrixVariable
@TOC 介绍 在Spring MVC项目中,<\context:component-scan>配置标签还会开启@Request-Mapping.@GetMapping等映射注解功能(也就 ...
最新文章
- Study on Android【三】--Intent消息传递
- 最大民科组织被取缔,鸡蛋返生、推翻相对论、量子速读都是他们干的
- Python入门100题 | 第064题
- 活动目录的备份与还原
- wind试用版 matlab,免费产品试用 - MATLAB Simulink
- mysql bdb 锁_BDB锁共享区域
- 《高并发Oracle数据库系统的架构与设计》一1.4 本章小结
- ubuntu下,apt的参数使用,很实用呦
- 896.Montonic Array - LeetCode
- Java借助百度云人脸识别实现人脸注册、登录功能的完整示例
- 数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态
- 分层聚类(Hierarchical clustering)
- 极限中0除以常数_第七讲 极限存在准则和两个重要极限
- mount挂载不上,不提示任何信息
- opencv-视频处理--画感兴趣区域(ROI)
- 使用了3年多的华硕笔记本电脑fl5900uq7500电脑感受-提示已接通电源、正在放电抓狂问题
- 全国程序员12月工资新鲜出炉,又降了!?
- Android 实现点击输入框以外的区域隐藏软键盘
- java linest_Java运行环境搭建的图文教程
- Fatal error: Port 9100 is already in use by another process. npm ERR! code ELIFECYCLE