2016-11-04 78 views
0

我有一個Spring Boot應用程序,並有一個web服務,用戶可以在其中發佈CollegeCourse實例的模型,其中包含該類和正在學習的學生之間的鏈接。 (這些數據用於在關聯表中存儲行,因爲這些類具有多對多的關係。)這可以很好地工作。我可以提交@Transactional序列的一部分嗎?

說在課程的註冊變化。用戶期望發送相同的JSON結構到處理PUT調用的web服務。代碼採取了更新的簡單途徑,首先查找並刪除所有現有的CollegeCourse-Student鏈接,然後保存新的鏈接。 (而不是遍歷兩個列表,匹配項目。)這部分也按照給定的方式工作。

然後,我們爲CollegeCourse-Student關聯表添加了一個唯一性約束,以便該表不能將多個單一Student連接到一個CollegeCourse。這崩潰和燒燬。調試會議揭示了罪魁禍首:在交易完成之前,刪除CollegeCourse-Student記錄實際上並沒有從數據庫中刪除它們。因此,當我們嘗試重新添加新鏈接時,原始POST中的任何暫停都會與數據庫中已存在的內容衝突。

處理PUT的服務前面有@Transactional註釋。我嘗試移動代碼以在單獨的方法中查找和刪除關聯,並嘗試了@Transactional(propagation = Propagation.REQUIRED)和REQUIRES_NEW,但都沒有阻止失敗唯一性約束。我還爲我的應用程序類添加了@EnableTransactionManagement - 同樣的故事。對我的困境有一個簡單的解決方案嗎?

+0

爲了充分理解您的問題,可以使用一些代碼片段來說明與'@ Transactional'註釋一起使用的方法。 –

回答

0

不知道你的倉庫看起來像什麼,你試過在刪除後在實體管理器上執行手動刷新嗎?

東西沿着

entityManager.flush(); 

行或者,如果您使用的是春天JPA的數據倉庫,你應該能夠確定在該界面中的沖洗方法,並調用它。

+0

我將flush方法添加到我的資源庫(基於CrudRepository),並允許它作爲內部事務運行。我將在星期一進行檢查,以確認外部事務處於活動狀態,並且在出現其他錯誤時可以回滾。 – LitterWalker

相關問題