SpringDataJpa報(bào)TransactionRequiredException異常

問(wèn)題描述

在代碼中利用Jpa自定義了update語(yǔ)句,比如下面的addAge方法:

@Repository
public interface StudentRepository extends JpaRepository<Student, Integer> {

    @Query(value = "update tb_student set age = age + 1 where 1 = 1 ", nativeQuery = true)
    @Modifying
    void addAge();

}

執(zhí)行此方法時(shí)吴裤,會(huì)報(bào)如下錯(cuò)誤:

javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:398) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1581) ~[hibernate-core-5.3.11.Final.jar:5.3.11.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:263) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) ~[spring-data-jpa-2.1.10.RELEASE.jar:2.1.10.RELEASE]

拋出javax.persistence.TransactionRequiredException: Executing an update/delete query 異常

原因分析

我們根據(jù)異常中的這句話

at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1581)

找到了AbstractProducedQuery中的executeUpdate方法:

    public int executeUpdate() throws HibernateException {
        getProducer().checkTransactionNeededForUpdateOperation( "Executing an update/delete query" );

        beforeQuery();
        try {
            return doExecuteUpdate();
        }
        catch ( QueryExecutionRequestException e) {
            throw new IllegalStateException( e );
        }
        catch( TypeMismatchException e ) {
            throw new IllegalArgumentException( e );
        }
        catch ( HibernateException e) {
            throw getExceptionConverter().convert( e );
        }
        finally {
            afterQuery();
        }
    }

進(jìn)入第一句話的checkTransactionNeededForUpdateOperation方法:

default void checkTransactionNeededForUpdateOperation(String exceptionMessage) {
    if ( !isTransactionInProgress() ) {
        throw new TransactionRequiredException( exceptionMessage );
    }
}

可以看到枢析,在執(zhí)行update語(yǔ)句前朝刊,JPA會(huì)判斷當(dāng)前語(yǔ)句是不是處于一個(gè)事務(wù)中墨微,若不在事務(wù)中,則會(huì)拋出TransactionRequiredException異常恤溶。

問(wèn)題解決

根據(jù)以上分析,要解決這個(gè)問(wèn)題很簡(jiǎn)單帜羊,讓代碼運(yùn)行在事務(wù)中即可咒程。在要執(zhí)行的addAge方法上面加上@Transactional注解,問(wèn)題解決讼育。

@Query(value = "update tb_student set age = age + 1 where 1 = 1 ", nativeQuery = true)
@Modifying
@Transactional
void addAge();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帐姻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奶段,更是在濱河造成了極大的恐慌饥瓷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹籍,死亡現(xiàn)場(chǎng)離奇詭異扛伍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)词裤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)刺洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吼砂,你說(shuō)我怎么就攤上這事逆航。” “怎么了渔肩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵因俐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我周偎,道長(zhǎng)抹剩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任蓉坎,我火速辦了婚禮澳眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛉艾。我一直安慰自己钳踊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布勿侯。 她就那樣靜靜地躺著拓瞪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪助琐。 梳的紋絲不亂的頭發(fā)上祭埂,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音兵钮,去河邊找鬼蛆橡。 笑死舌界,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的航罗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屁药,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼粥血!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酿箭,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤复亏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缭嫡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缔御,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年妇蛀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耕突。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡评架,死狀恐怖眷茁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纵诞,我是刑警寧澤上祈,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站浙芙,受9級(jí)特大地震影響登刺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗡呼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一纸俭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧南窗,春花似錦掉蔬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壕翩,卻和暖如春蛉迹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背放妈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工北救, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荐操,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓珍策,卻偏偏與公主長(zhǎng)得像托启,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攘宙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355