1

我尝试使用 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.

是否应该使用任何注释来实现这一点?

提前致谢

4

1 回答 1

0

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

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

于 2012-10-06T21:02:33.120 回答