[英]How one to many relationship gets persisted in JPA if i have thousands of related entities already in data base and i add new entities in collection
我們有兩個實體Entity1和Entity2,其中Entity1包含Entity2的集合,我們已經在實體類型Entity2的數據庫中存儲了成千上萬個實體,所有這些實體都是從Entity1實例(例如myEntity)引用的。
現在,如果我將更多Entity2實體添加到集合中,並嘗試保留myEntity,那么Entity2的新添加的實體已經存在。
我的問題是,對myEntity進行持久化時的行為將如何,是關系的現有成員將移動到內存中,並且將新成員添加到數據庫還是將新成員添加到數據庫而不將現有成員帶入內存
如果要將新實例添加到兩個已經存在的實體(在這種情況下是一對多)之間的關系中,則必須首先從數據庫中獲取包含集合的實體; 在您的情況下為myEntity
。
因此,當您加載該實體時,會將其帶入內存。 如果您將這兩個實體之間的關系定義為EAGER
則所有相關實體(集合中的實體)也將與父實體同時被獲取。 如果您否則將關系定義為LAZY
則在訪問集合時(即,當您調用該集合的getter getXXX
方法時)將加載相關實體。
之所以這樣,是因為JPA實現(現在我正在考慮使用Hibernate)返回的是實體的代理,而不是實際的實例,因此它們可以攔截getter / setter方法調用並對實體的狀態執行任何跟蹤。
正確,所以現在您想向該關系添加更多實例。 在這種情況下,關系是EAGER
還是LAZY
都沒有關系,因為您最終將調用該集合的getter方法,以便能夠執行add(myNewEntity);
在上面。 因此,已經存在的實體在集合中,而您只是在集合實現語義下添加了(可能)未跟蹤的實體。
當將myEntity
持久化回數據庫時,JPA實現將知道實際集合的哪些實例需要update
, delete
或insert
。 如果您只是添加了新實例,則只會發出insert
語句,但是您也可以從集合中刪除實體或更改已經存在的實例的狀態(調用設置器)。 JPA實現能夠識別這些操作並發出適當的SQL語句以使數據庫保持最新狀態。
如果您有成千上萬個引用的實體,最好不要映射該關系,而只在需要時查詢它-允許您使用分頁或其他機制來減少一次讀入的實體數量。 這取決於它是哪種映射類型,但是僅需要映射擁有關系(沒有映射依據的關系)才能在數據庫中設置外鍵。 如果尚未將Entity2一方設置為擁有方,請設置它。
如果這是一個帶有關系表的M:M,而不是從Entity2端進行映射,則可以為該關系表添加一個實體,該實體的讀取方式相同。 新實體將引用Entity1,但Entity1將不引用它,並且當需要獲取與特定Entity1相關聯的Entity2時,應用程序將查詢新實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.