2015-11-05 90 views
0

假設我有ID爲1的對象的我的持久層(上即DB)澄清合併的行爲

。如果我做了以下

A a = new A(); 
a.setId(1); 
a.setSomeField("a value"); 
A managed_a = entityManager.merge(a); 

將實體管理器檢索堅持在數據庫上使用ID爲1的實體, 使其受到管理,並相應地進行更新?

或者id爲1的對象必須存在於持久化上下文中才能發生上述情況?

回答

0

應用到實體X合併操作的語義如 如下:

  • 如果X是一個分離的實體,X的狀態被複制到預先存在的管理實體實例X '具有相同的身份或X的新託管副本X'被創建。
  • 如果X是新的實體實例,則會創建一個新的託管實體實例X',並將X的狀態複製到新的託管實體實例X'中。

關於第一點:如果爲1的ID的實體中的數據庫中的表已經存在,那意味着實體A是DETACHED實體。在這種情況下,實體A的字段將被合併到表中的數據中,因此您會將其視爲UPDATE操作。

關於第二點:如果您的實體A的ID爲1並不存在於您的數據庫表中,則實體A被視爲NEW實體。因此,這將是一個INSERT操作。

這兩種情況都會導致從合併操作返回的託管實體。

+0

好的,非常感謝你;) – GionJh