jpa、mybatis事务混合测试记录
来源:互联网 发布:网络爬虫 维基百科 编辑:程序博客网 时间:2024/06/05 18:03
环境
本次测试代码基于之前到《 springmvc、jpa(hibernate)、mybatis组合框架搭建(三)》搭建的环境。
配置文件调整
鉴于以前的spring-mybatis.xml和spring-jpa.xml中都有transaction相关的配置。datasource是配在spring-mybatis.xml中,但是却会被mybatis和jpa共同使用。 我们这次将新建了两个配置文件spring-datasource.xml和spring-transaction.xml内容分别如下:
spring-datasource.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- 数据源 org.apache.commons.dbcp.BasicDataSource com.alibaba.druid.pool.DruidDataSource --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="0" /> <!-- 连接池最大使用连接数量 --> <property name="maxActive" value="20" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="0" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="60000" /> <property name="validationQuery"><value>SELECT 1</value></property> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="6000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="25200000" /> <!-- 打开removeAbandoned功能 --> <property name="removeAbandoned" value="true" /> <!-- 1800秒,也就是30分钟 --> <property name="removeAbandonedTimeout" value="1800" /> <!-- 关闭abanded连接时输出错误日志 --> <property name="logAbandoned" value="true" /> <!-- 监控数据库 --> <!-- <property name="filters" value="stat" /> --> <!--<property name="filters" value="mergeStat" />--> </bean></beans>
spring-transaction.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --><!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>--> <!-- Jpa 事务配置 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean> <!-- Spring Data Jpa配置 --> <jpa:repositories base-package="nature.demo" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /></beans>
注意看我们注释掉了一个transactionManager的配置,因为是从之前两个配置文件里挪过来的,确实配重复了。同时记得去掉原来配置文件里同名的bean配置。以上配置,就完成了基础的使用注解的配置内容。
测试
jpa
我们设计的测试代码如下:
//@Transactionalpublic void jpaTransactionTest(){ TestJpa testJpa=new TestJpa(); testJpa.setId(2L); testJpa.setName("test2"); testJpa.setCreatetime(new Date()); jpaDemoDao.save(testJpa); //int test=1/0; testJpa.setId(3L); testJpa.setName("test3"); testJpa.setCreatetime(new Date()); jpaDemoDao.save(testJpa); }
以上代码,在DemoJpaService文件中,这个代码可以成功插入数据库两条记录。 删除数据库中插入的记录,放开注释//int test=1/0;再执行,发现第一条成功插入,第二条失败,也就是未启用事务。 删除数据库中插入的记录再把注释//@Transactional放开,发现一条都没有插入成功,事务生效。 至此,jpa事务生效。
mybatis
我们设计的测试代码与上述代码类似,如下:
//@Transactional public void mybatisTransctionTest(){ Map<String,Object> values=new HashMap<String,Object>(); values.put("id",3); values.put("name","test3"); demoDao.demoInsert(values); //int test=1/0; values=new HashMap<String,Object>(); values.put("id",3); values.put("name","test4"); demoDao.demoInsert(values); }
这里demoDao是注入到DemoJpaService类中的。mybatis里的sql这里就不写了,就是正常的插入sql。 直接执行,成功插入两条记录。 删除插入的记录,放开注释//int test=1/0;再执行,发现第一条成功插入,第二条失败,也就是未开启事务。 删除插入的数据,放开注释//@Transactional再执行,发现一条都没有插入,事务生效。 至此,mybatis事务生效。
混合
再添加一个方法如下:
//@Transactional public void mixTransction(){ this.jpaTransactionTest(); this.mybatisTransctionTest(); }
未开启注解时,两个方法如果有一个失败一个成功,将会发现,数据库里有三条数据,也就是,两个事务并未生效(这时那两个方法上都是有事务注解的)。然后我们放开注释//@Transactional再执行,发现,一条数据都没有插入。 然后我们放开jpaTransactionTest和mybatisTransctionTest上面任意一个注解,报错,未看到数据,也就是只需要在最上层的方法上打上注解就好。
注:这里我们只是测试了默认的事务级别,不同的事务级别之间的区别,回头找篇帖子转吧,备忘在这里,这次测试就到这里了。
阅读全文
0 0
- jpa、mybatis事务混合测试记录
- JPA事务和hibernate混合事务研究<一>
- JPA事务
- spring与mybatis整合的事务问题记录
- JPA调用事务
- JPA的事务配置
- JPA事务控制设置
- JPA事务简介
- mybatis spring 整合 junit测试无法提交事务
- mybatis事务
- 混合使用JPA和Hibernate
- 事务记录
- spring4学习记录05-spring mvc实战之框架构建测试jpa借助spring-data实现自动化jpa
- JPA Spring-Data-JPA hibernate mybatis
- 记录JPA使用情况
- JPA&Hibernate问题记录
- hibernate jdbc jpa 事务超时
- spring data jpa 事务控制
- HDU 4756 树形DP + prim
- Python3安装tkinter
- ssh is not mapped [FROM ssh]
- Python基础语法之——Lambda
- hibernate的工作原理以及为什么使用
- jpa、mybatis事务混合测试记录
- Apache VFS
- 01C++实现单例模式
- JavaScript的函数使用
- PAT--1077. Kuchiguse
- Java参数传递,值传递
- querylist 入门query部署,获取网页的信息。
- Excel导入SQL时,如何动态获得Sheet的名字
- stm32成长记之滴答时钟