0

更新:我發現在我的情況下,問題是我自己使用keyfactory.createKey()方法生成FbUser主鍵。如果我將其更改爲自動生成,則可以正常工作。但問題是我不想,因爲我的數據是字符串格式的關鍵。所以我需要手動將字符串類型更改爲鍵,然後保留它。

我正在使用Google App Engine JPA,並嘗試在我的實體之間建立oneToMany關係。

@Entity 
public class DummyParent{ 


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long id; 

//@Unowned 
@OneToMany(targetEntity=FbUser.class, mappedBy="dummyP", fetch=FetchType.LAZY, cascade = CascadeType.ALL) 
private ArrayList<FbUser> users; 
} 

這裏FbUser爲孩子:

@Entity 
public class FbUser { 

@Id 
private Key id; 
private String name; 
@ManyToOne(fetch=FetchType.LAZY) 
private DummyParent dummyP; 
} 

所以之後,我實例化父類設置其ID和設置用戶。但我收到以下例外情況:

Caused by: com.google.appengine.datanucleus.EntityUtils$ChildWithoutParentException: Detected attempt to establish DummyParent(no-id-yet) as the parent of FbUser("1322222") but the entity identified by FbUser("1322222") has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted. 
at com.google.appengine.datanucleus.EntityUtils.extractChildKey(EntityUtils.java:939) 
at com.google.appengine.datanucleus.StoreFieldManager.getDatastoreObjectForCollection(StoreFieldManager.java:967) 
at com.google.appengine.datanucleus.StoreFieldManager.storeFieldInEntity(StoreFieldManager.java:394) 

任何想法爲什麼會發生這種情況? P.s. HRD已啓用。

回答

2

因此,您堅持FbUser沒有父實體,然後嘗試在以後更改它,GAE數據存儲不允許(如消息說得很清楚)。您不會呈現持久性代碼,因此除猜測之外不可能發表任何評論。

解決方法:堅持正確(父母先,然後孩子),或堅持他們爲無主

+0

我堅持父母。使用應用引擎自動生成密鑰時,我能夠堅持這一切。但是當涉及到將鍵分配爲字符串,然後使用Keyfactory.createKey方法將其轉換爲Key時,則會引發上述錯誤。所以我只是把它放在了原來的位置上,並使用了自動密鑰生成功能,儘管根據我們已有的代碼,這可能不是我的最佳選擇。 – Sara 2013-04-23 01:00:30