我正在使用 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 注釋有什么我遺漏的嗎?如何使兩個保存作為單個事務工作并在任一保存拋出錯誤時回滾兩者?
添加回答
舉報
0/150
提交
取消