0002.Spring data jpa 測試時事務(wù)回滾了,但是數(shù)據(jù)還是插入到了表中

問題簡介

使用Spring data jpa + mysql對Dao層的save()方法進(jìn)行單元測試時玲献,期望在測試完后進(jìn)行回滾操作殉疼,結(jié)果未回滾,去表里面查看捌年,數(shù)據(jù)卻成功插入瓢娜。而Log日志顯示已經(jīng)進(jìn)行了回滾操作。日志如下:

2017-05-03 01:44:00 [DEBUG] org.hibernate.engine.transaction.internal.TransactionImpl | rolling back

問題出現(xiàn)時配置:

spring-context.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.xsd">

    <!--PropertyConfigurer-->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath*:*.properties</value>
            </list>
        </property>
    </bean>

    <import resource="classpath:spring-jdbc.xml"/>
    <!--<import resource="classpath:spring-aop.xml"/>-->
    <!--<import resource="classpath:spring-shiro.xml"/>-->
    <!--<import resource="classpath:spring-mvc.xml"/>-->

</beans>

spring-jdbc.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: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.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!-- 掃描DAO interface包礼预,自動完成DAO注入 添加事務(wù)管理 -->
    <jpa:repositories base-package="com.airkisser.auth.dao" transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory" repository-impl-postfix="Impl"/>

    <!-- 事務(wù)注解驅(qū)動 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- 事務(wù)管理器 使用JPA事務(wù)管理-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本屬性 url眠砾、user、password -->
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- 配置初始化大小托酸、最小褒颈、最大 -->
        <property name="initialSize" value="${druid.initialSize}"/>
        <property name="minIdle" value="${druid.minIdle}"/>
        <property name="maxActive" value="${druid.maxActive}"/>
        <!-- 配置獲取連接等待超時的時間 -->
        <property name="maxWait" value="${druid.maxWait}"/>
        <!-- 配置間隔多久才進(jìn)行一次檢測,檢測需要關(guān)閉的空閑連接励堡,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}"/>
        <!-- 配置一個連接在池中最小生存的時間谷丸,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}"/>
        <property name="validationQuery" value="${druid.validationQuery}"/>
        <property name="testWhileIdle" value="${druid.testWhileIdle}"/>
        <property name="testOnBorrow" value="${druid.testOnBorrow}"/>
        <property name="testOnReturn" value="${druid.testOnReturn}"/>
        <!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}"/>
        <property name="maxPoolPreparedStatementPerConnectionSize"
                  value="${druid.maxPoolPreparedStatementPerConnectionSize}"/>
        <!-- 配置監(jiān)控統(tǒng)計攔截的filters应结,去掉后監(jiān)控界面sql無法統(tǒng)計 -->
        <property name="filters" value="stat"/>
    </bean>

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!-- 注入數(shù)據(jù)源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定Jpa持久化實(shí)現(xiàn)廠商類,這里以Hibernate為例 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <!-- 指定自動掃描的注解實(shí)體類包 -->
        <property name="packagesToScan" value="com.airkisser.auth.model"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}</prop>
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
            </props>
        </property>
    </bean>

</beans>

jdbc.properties

# +++++++++++++++++++++
# jdbc properties
# +++++++++++++++++++++
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/auth_db?createDatabaseIfNotExist=true&characterEncoding=utf8
jdbc.user=root
jdbc.password=123456

# +++++++++++++++++++++
# hibernate properties
# +++++++++++++++++++++
# 方言
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.use_sql_comments=false

# +++++++++++++++++++++
# druid properties
# +++++++++++++++++++++
# 配置初始化連接池大小刨疼、最大并發(fā)數(shù)量、最小空閑數(shù)量
druid.initialSize=1
druid.maxActive=20
druid.minIdle=1

# 配置獲取連接等待超時的時間
druid.maxWait=60000

# 配置間隔多久才進(jìn)行一次檢測鹅龄,檢測需要關(guān)閉的空閑連接揩慕,單位是毫秒
druid.timeBetweenEvictionRunsMillis=60000

# 配置一個連接在池中最小生存的時間,單位是毫秒
druid.minEvictableIdleTimeMillis=300000

druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false

# 打開PSCache扮休,并且指定每個連接上PSCache的大小
# 如果用Oracle迎卤,則把poolPreparedStatements配置為true,mysql可以配置為false肛炮。分庫分表較多的數(shù)據(jù)庫止吐,建議配置為false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=20

測試 AuthGroupRepositoryTest.java

package com.airkisser.auth.dao;

import com.airkisser.auth.dao.auth.AuthGroupRepository;
import com.airkisser.auth.model.auth.AuthGroup;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

import java.util.Date;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

@ContextConfiguration(locations = {"classpath:spring-context.xml"})
public class AuthGroupRepositoryTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired
    private AuthGroupRepository authGroupRepository;

    @Test
    public void testAdd() {
        AuthGroup group = new AuthGroup();
        group.setGroupName("TestAdmin");
        group.setDescription("Desc");
        group.setCreateDate(new Date());
        authGroupRepository.save(group);
        AuthGroup g = authGroupRepository.findOne(group.getId());
        assertNotNull(g);
        assertEquals(group.getGroupName(), g.getGroupName());
    }

}

解決問題

將hibernate.dialect配置成hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect,指定MYSQL建表的時候使用InnoDB引擎(支持事務(wù)安全),使用MySQL5InnoDBDialect方言在生成表結(jié)構(gòu)的時候可以指定表的"ENGINE=InnoDB",而如果使用方言MySQL5Dialect,則在生成表結(jié)構(gòu)的時候默認(rèn)使用的是 ENGINE=MyISAM宝踪,該引擎不支持事務(wù),即使程序中使用事務(wù)碍扔,也不起作用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘩燥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子不同,更是在濱河造成了極大的恐慌厉膀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二拐,死亡現(xiàn)場離奇詭異服鹅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)百新,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門企软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饭望,你說我怎么就攤上這事仗哨。” “怎么了铅辞?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵厌漂,是天一觀的道長。 經(jīng)常有香客問我斟珊,道長苇倡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任囤踩,我火速辦了婚禮旨椒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘高职。我一直安慰自己钩乍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布怔锌。 她就那樣靜靜地躺著,像睡著了一般变过。 火紅的嫁衣襯著肌膚如雪埃元。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天媚狰,我揣著相機(jī)與錄音岛杀,去河邊找鬼。 笑死崭孤,一個胖子當(dāng)著我的面吹牛类嗤,可吹牛的內(nèi)容都是我干的糊肠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遗锣,長吁一口氣:“原來是場噩夢啊……” “哼货裹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起精偿,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弧圆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笔咽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔预,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年叶组,在試婚紗的時候發(fā)現(xiàn)自己被綠了拯田。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甩十,死狀恐怖船庇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枣氧,我是刑警寧澤溢十,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站达吞,受9級特大地震影響张弛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪劫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一吞鸭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧覆糟,春花似錦刻剥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麦箍,卻和暖如春漓藕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挟裂。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工享钞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诀蓉。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓栗竖,卻偏偏與公主長得像暑脆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狐肢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • MySQL技術(shù)內(nèi)幕:InnoDB存儲引擎(第2版) 姜承堯 第1章 MySQL體系結(jié)構(gòu)和存儲引擎 >> 在上述例子...
    沉默劍士閱讀 7,417評論 0 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理添吗,服務(wù)發(fā)現(xiàn),斷路器处坪,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 本文包括: 1根资、CRM 項目的整體介紹 2、Hibernate 框架概述 3同窘、Hibernate 快速入門 4玄帕、H...
    廖少少閱讀 3,475評論 9 66
  • 首先裤纹,比特幣是什么呢?簡單來說比特幣是點(diǎn)對點(diǎn)的現(xiàn)金支付系統(tǒng)丧没。它有幾大特點(diǎn)鹰椒,去中心化,沒有發(fā)行機(jī)構(gòu)呕童,也就是沒有中央銀...
    2124f1c7b152閱讀 343評論 0 0