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 事务配置相关推荐

  1. java中mvc事务_Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 以下所使用环境为Spring4.0.3.Hibernate4.3 ...

  2. spring mvc mysql配置_spring mvc配置数据库连接

    ACM 配置中心实战:Spring + MyBatis + Druid + ACM 很多基于 Spring MVC 框架的 Web 开发中,Spring + MyBatis + Druid 是一个黄金 ...

  3. Spring boot的Spring MVC自动配置原理

    Spring MVC自动配置 搜索WebMvcAutoConfiguration 查询ContentNegotiatingViewResolver ContentNegotiatingViewReso ...

  4. Servlet 3 + Spring MVC零配置:去除所有xml

    在一些基于Spring/Spring MVC的Java Web项目中,总是会有一些xml配置文件,如web.xml.applicationContext.xml等,本文的目标即消灭这些xml配置文件, ...

  5. spring mvc事务没有生效的原因

    spring-mvc事务配置如下 <tx:advice id="transactionAdvice" transaction-manager="transactio ...

  6. spring中事务配置的3种方式-2

    http://doc.javanb.com/spring-framework-reference-zh-2-0-5/ch09s05.html http://zpchen.iteye.com/blog/ ...

  7. Spring MVC零配置(全注解)(版本5.0.7)

    // 核心配置类 package spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConf ...

  8. Spring boot的Spring MVC自动配置

    自动配置 参考官网 https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#boot-features ...

  9. 【spring学习笔记】(二)Spring MVC注解配置 参数转换注解@RequestMapping@RequestParam、@PathVariable@MatrixVariable

    @TOC 介绍 在Spring MVC项目中,<\context:component-scan>配置标签还会开启@Request-Mapping.@GetMapping等映射注解功能(也就 ...

最新文章

  1. Study on Android【三】--Intent消息传递
  2. 最大民科组织被取缔,鸡蛋返生、推翻相对论、量子速读都是他们干的
  3. Python入门100题 | 第064题
  4. 活动目录的备份与还原
  5. wind试用版 matlab,免费产品试用 - MATLAB Simulink
  6. mysql bdb 锁_BDB锁共享区域
  7. 《高并发Oracle数据库系统的架构与设计》一1.4 本章小结
  8. ubuntu下,apt的参数使用,很实用呦
  9. 896.Montonic Array - LeetCode
  10. Java借助百度云人脸识别实现人脸注册、登录功能的完整示例
  11. 数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态
  12. 分层聚类(Hierarchical clustering)
  13. 极限中0除以常数_第七讲 极限存在准则和两个重要极限
  14. mount挂载不上,不提示任何信息
  15. opencv-视频处理--画感兴趣区域(ROI)
  16. 使用了3年多的华硕笔记本电脑fl5900uq7500电脑感受-提示已接通电源、正在放电抓狂问题
  17. 全国程序员12月工资新鲜出炉,又降了!?
  18. Android 实现点击输入框以外的区域隐藏软键盘
  19. java linest_Java运行环境搭建的图文教程
  20. Fatal error: Port 9100 is already in use by another process. npm ERR! code ELIFECYCLE

热门文章

  1. iOS限制文本输入长度进阶之 一
  2. 访问iis元数据库失败怎么解决
  3. struts1和struts2的区别2
  4. 学用MVC4做网站五:5.4删除文章
  5. 转 海量数据处理(2)
  6. filemode对git diff的影响
  7. 数据结构笔记(十八)-- 树的定义和基本术语
  8. 排队问题解题思路_教育随笔|数学之排队问题
  9. C++相对路径下新建文件夹
  10. java对mysql进行查找替换_Java对MySQL数据库进行连接、查询和修改【转载】