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上面任意一个注解,报错,未看到数据,也就是只需要在最上层的方法上打上注解就好。

注:这里我们只是测试了默认的事务级别,不同的事务级别之间的区别,回头找篇帖子转吧,备忘在这里,这次测试就到这里了。