2015-11-07 18 views
2

JPA
是ID 實體類的一個實例建立認爲分離,即使是剛剛創建it'hasJPA:獨立VS短暫定義

或類似:

是一個實體類的ID爲一個實例沒有設置始終認爲短暫

我問這是因爲經常jpa方法在兩種情況下有不同的行爲。

回答

3

transientdetached狀態之間的差異不是由實體本身決定的。給定一個實體的實例,並不總是可以100%確定它是暫時的還是分離的。區別僅在於邏輯 - 當實體實例先前附加到持久性上下文時,實體實例被定義分離。這也意味着在後臺數據庫中有相應的記錄。

在另一方面,答案第二問題是 - 沒有ID的實體還沒有被持久化(附後),因此它必須是仍然短暫。這是唯一的情況,當你可以確定狀態。由於分離的實體對應於數據庫中的記錄,並且因爲id對於JPA中的持久實體是強制性的,所以分離實體必須有的id(分配給您的代碼或由JPA提供程序自動分配)。

這裏是實體生命週期的狀態和有效的行動,這使得狀態之間的轉換的詳盡的解釋:儘管實體被認爲detached只有當以前attached,就可以創建一個假分離的實體Entity lifecycle management

之前沒有附加。但這主要是一種破解,並且不受規範支持。對於大多數情況下,設置正確的id就足夠了。但是,如果您還使用@Version列進行樂觀鎖定,則還必須爲該列設置正確的值。如果您使用JPA提供程序的其他非標準機制,則可能會發生這種情況,您仍然會遇到一些麻煩。