TL;DR:呼叫repository.save()
擁有物體來保持關系是否足夠,還是我需要保存兩個物體?
假設我有兩個物體,A
以及它們之間B
的oneToMany關系。A
可以有多個B
,B
可以有一個A
。B
是關系的擁有方(具有外鍵)。如果我有兩個已經持久化的物體并且想要添加并保持它們之間的關系,那么我通常會這樣做:
a.addB(b);
b.setA(a);
bRepository.save(b);
我的問題是,我還需要打電話aRepository.save(a)
嗎?在此先感謝,谷歌搜索并沒有幫助我找到答案。
uj5u.com熱心網友回復:
如果正如您所描述的那樣,關系由 擁有B
,A
就 JPA 而言根本沒有改變。所以不需要堅持。
如果您已持久化或加載A
并B
在當前會話中,save
則在技術上根本不需要。JPA 跟蹤物體,注意它們已更改,并將在事務結束時將更改重繪 到資料庫。
uj5u.com熱心網友回復:
好問題,假設您已經保存了 A 物體,答案應該是您不需要再次保存父 A 物體,因為您自己已將子物體 B 添加到 A 的子串列中,并且 A 已經保留。
如果您重新加載 A 及其所有子項,您應該得到與當前相同的串列。
由于它是延遲加載的,因此您的查詢應該在您想要的情況下專門加載子項,否則您可能會遇到假設 A 具有所有子項但如果您從資料庫中重新加載 A 而沒有獲取它們的情況。
總的來說,盡管我不得不質疑為什么您首先要保留 A。快取可能是一件好事,但您的快取應該在其子項更新時重繪 A,并且如果需要,應該獲取 A 的所有子項。在這種情況下,您不需要自己將新孩子添加到 A 中 b/c 無論如何它都會被覆寫。可能沒有什么壞處,但你為什么要第二次猜測快取呢?
更一般地,該模式只是保存 B 并完成它。如果您的代碼需要 A 及其所有子項,則應在需要時從資料庫中獲取。
這些想法不包括 JPA 物體快取,因為我沒有嘗試對此進行非常具體的詳細說明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470368.html