Google应用引擎和JPA

时间:2012-10-06 20:53:16

标签: google-app-engine jpa

我尝试持久化包含预定义实例(实体)的实例(实体),使用JPA和GAE,关系是oneToOne,如下所示:

@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.

是否应该使用任何注释才能实现此目的?

提前致谢

1 个答案:

答案 0 :(得分:0)

问题是DataStore如何存储密钥。您的关系类型是父/子,因此对于City,您将拥有Adress作为父母。这意味着您将使用父组合键作为地址。您的城市已经存在,因此您将无法更改密钥(密钥不能在创建后动态更改。它们是不可变的)。

我不认为OneToOne参考适合您。你为什么需要一个单独的对象?如果你真的需要它 - 不要试图保持参考完整性。它在NoSQL中非常昂贵,可能会导致很多问题。