2012-11-05 112 views
0

我對JPA處理添加/更新實體的方式有些困惑。JPA EclipseLink添加/更新實體

ATM,我有這段代碼:

AltContact c = new AltContact("test"); 
save(c) 
System.out.println("ENTITY: " + contains(c)); 
c.setEnterpriseName("test2"); 
save(c); 
System.out.println("ENTITY: " + contains(c)); 

保存方法是在我的應用程序的服務器端的簡單方法要求對EntityManager的合併:

public void save (Object e) { 
    em.merge(e); 
    em.flush(); 
} 

其中emEntityManager的實例。

包含再次是服務器端的一種方法,它會詢問實體管理器在當前持久化上下文中是否存在給定的實體。

上面的代碼在我的表中創建了兩行,第一個值爲「test」,另一個值爲「test2」,這不是我想要的。

我想創建一個值爲「test」的新行,然後,在創建行後立即更新它並將其值設置爲「test2」。我打印出來的包含的回報,雙方打電話給保存,false被退回了兩次。

我想來自於事實,我的實體是不是第一次調用保存所以,當我再次撥打保存後持久性上下文的一部分的問題,實體管理器認爲這是一個新的實體,並創建一個新排。

如何才能實現這個更新過程?

+0

我認爲這個答案(http://stackoverflow.com/a/1070629/1256525)到一個類似的問題應該可以解決你的問題。 – semTex

回答

1

有幾件事。首先,爲什麼你需要使用merge()是你序列化的實例,爲什麼?如果您只編輯持久化上下文返回的對象,則不需要進行任何合併或保存。

如果您需要將對象編輯爲序列化或分離的對象,那麼對於新對象,您需要從保存中返回對象的Id,這是將分離對象與受管理對象關聯的內容。理想情況下,您可以在編輯它之前執行find()來獲取對象。