2012-10-06 124 views
1

我試着堅持一個實例,其中包含一個預定義的情況下(實體)(實體),JPA和GAE的關係oneToOne,如下:谷歌App Engine和JPA

@Entity class Address{ ... @OneToOne(cascade = CascadeType.ALL)private City city;} 

@Entity class City{...} 

我創建城市實例(實體),並堅持它,做工不錯,試圖創建一個包含創造城市的實例(因爲從UI,從下拉列表框中選擇)地址實例時,我得到了以下異常:

javax.persistence.PersistenceException: Detected attempt to establish Address(no-id-yet) as the parent of City(20) but the entity identified by City(20) has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted. 

是那麼應該使用任何註釋來實現這一點?

在此先感謝

+0

所以你使用GAE「擁有」關係,並有所有權問題。引用你的持久性代碼(什麼對象傳遞給持久性,你的事務在哪裏?)將是一個開始,因爲如果沒有它,你不會向人們定義你在做什麼。 – DataNucleus

回答

0

問題是DataStore如何存儲密鑰。你的關係類型是父母/子女,所以對於城市,你將有地址作爲父母。這意味着你將有父母作爲地址的組合鍵。你的城市已經存在,所以你將無法改變密鑰(密鑰不能在創建後動態更改,它們是不可改變的)。

我不認爲OneToOne參考適合您。爲什麼你需要一個單獨的對象?如果你真的需要它 - 不要試圖保持參考完整性。在NoSQL中非常昂貴,可能會導致很多問題。