1
試想一下簡單的「樹」 JPA實體:瞭解EntityManager的合併操作的行爲
public class TreeItem {
@OneToMany(mappedBy = "parentItem")
private List<TreeItem> childItems;
@ManyToOne
@JoinColumn(name = "parent_id"
private TreeItem parentItem;
@Column
private String name;
}
現在這些實體被加載一個,傳遞到網絡層,更新並傳回給EJB的保存操作。我注意到,在執行merge()
操作期間,無論樹實體駐留多深,在發出一個update
sql命令之前,整個樹都會被加載。這是爲什麼發生?我無法看到這種行爲背後的原因,因爲我沒有設置級聯選項。
更新: 是的,傳回的實體是分離的,需要將其狀態與數據庫層同步,這就是我的理解。但是我不明白的是,爲什麼同步需要閱讀整棵樹,而不考慮懶惰的關係。
你的問題不清楚。顯示代碼。一般而言,如果傳遞給合併的實體被分離,那麼它的狀態將從數據庫加載,以創建新的託管圖。如果你不明白爲什麼會發生這種情況,我的猜測是你並不真正理解merge()的語義。在傳遞給merge()的分離對象的情況下,合併將返回一個新實例化對象(圖)作爲分離狀態的託管表示。這就是merge()有回報的原因。至於它加載多少,那麼取決於我說你的問題還不夠清楚。 –
@Steve,謝謝,我會更新這個問題,是的 - 實體是分離的,但我仍然不明白爲什麼'合併'應該加載整個樹來做更多的查詢而不是'em.find()' – Osw
你會意識到該parentItem是不是懶惰的權利? –