Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 608|回复: 0

[默认分类] Spring MVC 事务配置

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-6-1 10:30:33 | 显示全部楼层 |阅读模式
    Spring MVC事务配置
    要了解事务配置的所有方法,请看一下《Spring事务配置的5种方法
    本文介绍两种配置方法:
      
    一、      XML,使用tx标签配置拦截器实现事务
    一、      Annotation方式
    以下所使用环境为Spring4.0.3、Hibernate4.3.5
      
    一、      XML,使用tx标签配置拦截器实现事务
    Entity类User.java,持久化类,对应数据库表user

    1. package com.lei.demo.entity;
    2. import javax.persistence.*;
    3. @Entity(name="users")
    4. public class Users {
    5.    
    6.     public Users(){
    7.         super();
    8.     }
    9.    
    10.     @Id
    11.     @GeneratedValue(strategy=GenerationType.AUTO)
    12.     @Column(name="id")
    13.     private Integer id;
    14.    
    15.     @Column(name="user_name",length=32)
    16.     private String user_name;
    17.    
    18.     @Column(name="age")
    19.     private Integer age;
    20.    
    21.     @Column(name="nice_name",length=32)
    22.     private String nice_name;
    23.    
    24.     //属性实现......
    25. }
    复制代码


      
    UserDAO.javar,表user的一些操作,其中属性sessionFactory应该由Spring注入,如下:

    1. package com.lei.demo.dao;
    2. import java.util.List;
    3. import javax.annotation.Resource;
    4. import org.hibernate.Query;
    5. import org.hibernate.Session;
    6. import org.hibernate.SessionFactory;
    7. import org.springframework.stereotype.Repository;
    8. import com.lei.demo.entity.Users;
    9. public class UsersDAO {
    10.     private SessionFactory sessionFactory;
    11.     public void setSessionFactory(SessionFactory sessionFactory) {
    12.         this.sessionFactory = sessionFactory;
    13.     }
    14.     public SessionFactory getSessionFactory() {
    15.         return sessionFactory;
    16.     }
    17.     public List<Users> getAllUser(){
    18.         String hsql="from users";
    19.         Session session = sessionFactory.getCurrentSession();
    20.         Query query = session.createQuery(hsql);
    21.         
    22.         return query.list();
    23.     }
    24. }
    复制代码


      
    UserService.java,业务实现类,如下

    1. package com.lei.demo.service;
    2. import javax.annotation.Resource;
    3. import org.springframework.stereotype.Service;
    4. import org.springframework.transaction.annotation.Isolation;
    5. import org.springframework.transaction.annotation.Propagation;
    6. import org.springframework.transaction.annotation.Transactional;
    7. import com.lei.demo.dao.*;
    8. public class UserService {
    9.     private UsersDAO userDao;
    10.    
    11.     public int userCount(){
    12.         return userDao.getAllUser().size();
    13.     }
    14.     public UsersDAO getUserDao() {
    15.         return userDao;
    16.     }
    17.     public void setUserDao(UsersDAO userDao) {
    18.         this.userDao = userDao;
    19.     }
    20. }
    复制代码


      
    首先看一下xml配置,spring-hibernate.xml如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3.     xmlns:context="http://www.springframework.org/schema/context"
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5.     xmlns:tx="http://www.springframework.org/schema/tx"
    6.     xmlns:aop="http://www.springframework.org/schema/aop"
    7.     xsi:schemaLocation="
    8.         http://www.springframework.org/schema/beans     
    9.         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    10.         http://www.springframework.org/schema/context
    11.         http://www.springframework.org/schema/context/spring-context-4.0.xsd
    12.         http://www.springframework.org/schema/aop
    13.         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    14.         http://www.springframework.org/schema/tx
    15.         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    16.         ">
    17.     <!-- Hibernate4 -->
    18.     <!-- 加载资源文件  其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载-->
    19.     <context:property-placeholder location="classpath:persistence-mysql.properties" />
    20.    
    21.     <bean id="sessionFactory"
    22.         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    23.         <property name="dataSource" ref="dataSource" />
    24.         <property name="packagesToScan">
    25.             <list>
    26.                 <!-- 可以加多个包 -->
    27.                 <value>com.lei.demo.entity</value>
    28.             </list>
    29.         </property>
    30.         <property name="hibernateProperties">
    31.             <props>
    32.                 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
    33.                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    34.                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
    35.                 <!--  <prop key="hibernate.current_session_context_class">thread</prop> -->
    36.             </props>
    37.         </property>
    38.     </bean>
    39.    
    40.     <!-- 数据库映射 -->
    41.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    42.       <property name="driverClassName" value="${jdbc.driverClassName}" />
    43.       <property name="url" value="${jdbc.url}" />
    44.       <property name="username" value="${jdbc.user}" />
    45.       <property name="password" value="${jdbc.pass}" />
    46.    </bean>
    47.    
    48.     <!-- 配置Hibernate事务管理器 -->
    49.     <bean id="transactionManager"
    50.         class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    51.       <property name="sessionFactory" ref="sessionFactory" />
    52.    </bean>
    53.    
    54.    <!-- 配置事务异常封装 -->
    55.    <bean id="persistenceExceptionTranslationPostProcessor"
    56.        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    57.    
    58.    <!--  声明式容器事务管理 ,transaction-manager指定事务管理器为transactionManager -->
    59.     <tx:advice id="txAdvice" transaction-manager="transactionManager">
    60.         <tx:attributes>
    61.             <tx:method name="add*" propagation="REQUIRED" />
    62.             <tx:method name="get*" propagation="REQUIRED" />
    63.             <tx:method name="*" read-only="true" />
    64.         </tx:attributes>
    65.     </tx:advice>
    66.    
    67.     <aop:config expose-proxy="true">
    68.         <!-- 只对业务逻辑层实施事务 -->
    69.         <aop:pointcut id="txPointcut" expression="execution(* com.lei.demo.service..*.*(..))" />
    70.         <!-- Advisor定义,切入点和通知分别为txPointcut、txAdvice -->
    71.         <aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
    72.     </aop:config>
    73.    
    74. </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,如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.     xmlns="http://java.sun.com/xml/ns/javaee"
    4.     xmlns:web="http://java.sun.com/xml/ns/javaee"
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    6.         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    7.         id="WebApp_ID" version="3.0">
    8.   <display-name>Archetype Created Web Application</display-name>
    9.   <context-param>
    10.     <param-name>contextConfigLocation</param-name>
    11.     <param-value>classpath:/spring-*.xml</param-value>
    12.   </context-param>
    13.   <listener>
    14.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    15.   </listener>
    16.   <servlet>
    17.     <servlet-name>lei-dispatcher</servlet-name>
    18.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    19.     <init-param>
    20.       <param-name>contextConfigLocation</param-name>
    21.       <param-value>classpath:/lei-dispatcher-servlet.xml</param-value>
    22.     </init-param>
    23.     <load-on-startup>1</load-on-startup>
    24.   </servlet>
    25.   <servlet-mapping>
    26.     <servlet-name>lei-dispatcher</servlet-name>
    27.     <url-pattern>/</url-pattern>
    28.   </servlet-mapping>
    29. </web-app>
    复制代码


      
    第二步,spring-hibernate配置,见以下spring-hibernate.xml配置

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3.     xmlns:context="http://www.springframework.org/schema/context"
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5.     xmlns:tx="http://www.springframework.org/schema/tx"
    6.     xmlns:aop="http://www.springframework.org/schema/aop"
    7.     xsi:schemaLocation="
    8.         http://www.springframework.org/schema/beans     
    9.         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    10.         http://www.springframework.org/schema/context
    11.         http://www.springframework.org/schema/context/spring-context-4.0.xsd
    12.         http://www.springframework.org/schema/aop
    13.         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    14.         http://www.springframework.org/schema/tx
    15.         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    16.         ">
    17.     <!-- Hibernate4 -->
    18.     <!-- 加载资源文件  其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载-->
    19.     <context:property-placeholder location="classpath:persistence-mysql.properties" />
    20.    
    21.     <bean id="sessionFactory"
    22.         class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    23.         <property name="dataSource" ref="dataSource" />
    24.         <property name="packagesToScan">
    25.             <list>
    26.                 <!-- 可以加多个包 -->
    27.                 <value>com.lei.demo.entity</value>
    28.             </list>
    29.         </property>
    30.         <property name="hibernateProperties">
    31.             <props>
    32.                 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
    33.                 <prop key="hibernate.dialect">${hibernate.dialect}</prop>
    34.                 <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
    35.                 <!--  <prop key="hibernate.current_session_context_class">thread</prop> -->
    36.             </props>
    37.         </property>
    38.     </bean>
    39.    
    40.     <!-- 数据库映射 -->
    41.     <!--  class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" -->
    42.     <!--  class="org.springframework.jdbc.datasource.DriverManagerDataSource" -->
    43.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    44.       <property name="driverClassName" value="${jdbc.driverClassName}" />
    45.       <property name="url" value="${jdbc.url}" />
    46.       <property name="username" value="${jdbc.user}" />
    47.       <property name="password" value="${jdbc.pass}" />
    48.    </bean>
    49.    
    50.     <!-- 配置Hibernate事务管理器 -->
    51.     <bean id="transactionManager"
    52.         class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    53.       <property name="sessionFactory" ref="sessionFactory" />
    54.    </bean>
    55.    
    56.    <!-- 配置事务异常封装 -->
    57.    <bean id="persistenceExceptionTranslationPostProcessor"
    58.        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    59. </beans>
    复制代码


    第一节中xml配置事务中需要通过配置tx:advice和aop:config来增加事务的功能。此处采用全注释方法,这两个配置节就不需要了。
      
    相应的需要在视图解析配置中启用注释,如下lei-dispatcher-Servlet.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3.     xmlns:context="http://www.springframework.org/schema/context"
    4.     xmlns:mvc="http://www.springframework.org/schema/mvc"
    5.     xmlns:p="http://www.springframework.org/schema/p"
    6.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    7.     xmlns:tx="http://www.springframework.org/schema/tx"
    8.     xsi:schemaLocation="
    9.         http://www.springframework.org/schema/beans     
    10.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    11.         http://www.springframework.org/schema/context
    12.         http://www.springframework.org/schema/context/spring-context-3.0.xsd
    13.         http://www.springframework.org/schema/mvc
    14.         http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    15.         http://www.springframework.org/schema/tx
    16.         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    17.         ">
    18.         
    19.     <!-- 启动自动扫描 该包下所有的Bean(@Controller) -->
    20.     <context:component-scan base-package="com.lei.demo" />
    21.    
    22.     <!-- 基于注释的事务,当注释中发现@Transactional时,使用id为“transactionManager”的事务管理器  -->
    23.     <!-- 如果没有设置transaction-manager的值,则spring以缺省默认的事务管理器来处理事务,默认事务管理器为第一个加载的事务管理器 -->
    24.     <tx:annotation-driven transaction-manager="transactionManager"/>
    25.    
    26.     <!-- 定义视图解析器 -->
    27.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    28.         <property name="prefix">
    29.             <value>/WEB-INF/user/</value>
    30.         </property>
    31.         <property name="suffix">
    32.             <value>.jsp</value>
    33.         </property>
    34.     </bean>
    35.    
    36. </beans>
    复制代码


      
    UserDAO如下

    1. package com.lei.demo.dao;
    2. import java.util.List;
    3. import javax.annotation.Resource;
    4. import org.hibernate.Query;
    5. import org.hibernate.Session;
    6. import org.hibernate.SessionFactory;
    7. import org.springframework.stereotype.Repository;
    8. import com.lei.demo.entity.Users;
    9. @Repository public class UsersDAO {
    10.     @Resource(name="sessionFactory")
    11.     private SessionFactory sessionFactory;
    12.     public void setSessionFactory(SessionFactory sessionFactory) {
    13.         this.sessionFactory = sessionFactory;
    14.     }
    15.     public SessionFactory getSessionFactory() {
    16.         return sessionFactory;
    17.     }
    18.     public List<Users> getAllUser(){
    19.         String hsql="from users";
    20.         Session session = sessionFactory.getCurrentSession();
    21.         Query query = session.createQuery(hsql);
    22.         
    23.         return query.list();
    24.     }
    25. }
    复制代码


      
    UserService.java如下

    1. package com.lei.demo.service;
    2. import javax.annotation.Resource;
    3. import org.springframework.stereotype.Service;
    4. import org.springframework.transaction.annotation.Isolation;
    5. import org.springframework.transaction.annotation.Propagation;
    6. import org.springframework.transaction.annotation.Transactional;
    7. import com.lei.demo.dao.*;
    8. @Service("userService")
    9. public class UserService {
    10.     @Resource private UsersDAO userDao;
    11.    
    12.     @Transactional public int userCount(){
    13.         return userDao.getAllUser().size();
    14.     }
    15.     public UsersDAO getUserDao() {
    16.         return userDao;
    17.     }
    18.     public void setUserDao(UsersDAO userDao) {
    19.         this.userDao = userDao;
    20.     }
    21. }
    复制代码


    这里,方法名userCount上加入@Transactional,说明这个方法要启用事务。如果类名UserService上加入@Transactional,则表明这个类中的所有方法都会启用事务。
    如果配有多个transactionManager,例如配置有transactionManager1,和transactionManager2,则可以通过@Transactional(“transactionManager1”),的方式指定使用哪个数据源的事务。
      
    源代码下载:
    http://www.oschina.net/code/snippet_1764868_35775
      
      
    友情赞助
      
    如果您喜欢此文,感觉对您工作有帮助,预期领导会给您涨工资,不妨小额赞助一下,让我有动力继续努力。
      
    赞助方式1:打开支付宝App,使用“扫一扫”付款,付款码见下图,别忘了付款留言哦!
      

      
    赞助方式2:支付宝扫一下,领取我的的大红包,并花掉,双方受益
      

    赞助方式3: 如果您有微信钱包,请打开微信,使用“扫一扫”付款,付款码见下图

      
      
      
    转载请注明出处!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 15:26 , Processed in 0.415491 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表