2011-12-15 51 views
0

我有一個人物,一個電腦物體, 這個人物有一個名爲computer的字段, 一個人可以有一臺電腦,一對一的關係。級聯類型:ALL,MERGE等

class Person{ 

    @OneToOne(cascade=CascadeType.ALL)//in which situations this is true? 
    @JoinColumn(name = "computer_id",nullable=false) 
    private Computer computer; 

    getComputer(){...} 
    setComputer(Computer c){...} 

    @Id 
    private String id; 
} 

class Computer{ 

    @Id 
    private String id; 

} 

讓我假設我在數據庫上有一個計算機對象,並使用加載方法得到它。

Computer computer=entityManager.loadById({an id}); 
Person p=new Person(); 
p.setComputer(computer); 

現在,如果我想同時保存電腦和個人,我應該怎麼做?

entityManager.persist(p); 

我不能生成相同的錯誤,但前一段時間我得到了「分離的實體傳遞到持久」錯誤。

什麼是最合適的方式將所有內容保存到數據庫而不重複?

另外,你也可以建議一個資源(一本書也許)瞭解在不同情況下做什麼。

回答

3

你不需要在你描述的情況下,任何級聯,並堅持用戶是不夠的:

  • 因爲計算機已經使用EM加載,它連接到EM。在計算機上完成的任何更改將自動保存到數據庫,而無需任何操作
  • 用戶是一個新的實體,它尚未持久化。要使其持久,您必須致電persist。此調用後,它會附着在EM,和對用戶所做的任何更改也將自動保存到數據庫中,而不需要任何操作

錯誤「通過堅持超脫實體」可能發生,如果你創建一臺新計算機,然後創建一個新用戶,將計算機設置給用戶,並堅持用戶。在這種情況下,EM抱怨是因爲您嘗試使持久性en實體(用戶)引用另一個不持久的實體(計算機)。解決辦法有兩個:

  • 讓使用戶持久的,在電腦前持續通過調用persist與計算機
  • 註釋與級聯person.computer協會=持續或級聯= ALL,從而使計算機被持久化當用戶持久化時自動進行。請注意,ALL也包含REMOVE。所以如果你刪除了一個用戶,它的電腦也將被刪除。
+0

非常感謝您的回覆。我想問,什麼時候「堅持」消失。你說當我打電話堅持後,做出改變,它會去分貝,但直到什麼時候?之後,我的對象失去了持久性。例如一個方法:'公共計算機foo(){計算機c =新計算機(); em.persist(c);}'在main中我調用foo'Computer comp = foo();''Person person = new Person(); person.add(COMP); em.persist(person);' – merveotesi

+0

直到實體變爲分離狀態,即圍繞這些調用的事務被提交或回滾時。如果您序列化和反序列化實體,則生成的實體也會分離。 –