亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring Boot - Hibernate,異常時回滾成功保存

Spring Boot - Hibernate,異常時回滾成功保存

白板的微信 2023-08-09 15:30:25
我正在使用 Spring Boot v2.1.3.RELEASE 和 Hibernate v5.3.6 構建一個應用程序。之前,我問了一個關于如何跨多個服務/存儲庫使用 @Transactional 回滾的問題。通過將我的實體與 @OneToOne 和 @OneToMany 注釋鏈接在一起,我得到了我需要的東西?,F在我面臨一個新問題。在單個服務的函數內,我保存兩個單獨的實體列表。一個列表已保存,而另一個列表由于違反唯一鍵約束而失敗。自從我測試以來,預計這會失敗。但是,我還沒有弄清楚如何使用 @Transactional 注釋我的 Service 或方法,以便當第二個列表無法保存時,它也會回滾第一個列表的任何成功保存。例如:@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)protected void saveLists() {    List<Object> list1 = this.repository.getListOne();    List<Object> list2 = this.repository.getListTwo();    //Loop through list one and do some manipulation    //Loop through list two and do some manipulation    this.repository.saveAll(list1); // this saves all successfully    this.repository.saveAll(list2); // this has unique key exception    // rollback both list1 and list2 changes}在上面的示例中,list2 拋出異常后,list1 中的數據已成功保存并出現在數據庫中。我認為,由于它們位于相同的服務和相同的方法中,使用相同的存儲庫,因此它們將使用相同的事務,并且 Hibernate 不會提交事務,直到該方法沒有錯誤為止。但事實似乎并非如此。由于列表一的數據正在提交并且沒有回滾。@Transactional 注釋有什么我遺漏的嗎?如何使兩個保存作為單個事務工作并在任一保存拋出錯誤時回滾兩者?
查看完整描述

2 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

您好@Transactional 不適用于私有或受保護的方法,您的方法應該是公共的。為什么?因為spring應該創建一個代理來處理事務劃分和行為。由于不可能代理受保護或私有方法,因此您的注釋將被忽略。



查看完整回答
反對 回復 2023-08-09
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

您只需要使用 @Transactional 注釋在控制器中調用的服務方法而不是此方法?;蛘吣憧梢杂聾Transactional注釋Service類



查看完整回答
反對 回復 2023-08-09
  • 2 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號