我有三个实体用户、公司和地址,声明如下:
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent(mappedBy="creator")
@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="title asc"))
private Collection<Company> companies;
@Persistent
private Address address;
. . .
}
public class Company implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private Key creatorKey;
@Persistent
private User creator;
@Persistent
private Address address;
. . .
}
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Address implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
. . .
}
创建用户后,我在设置地址和其他信息后保留用户拥有的两家公司,如下所示:
company.setCreatorKey(currentUser.getKey());
pm.makePersistent(company);
当我检索一家公司并从该对象引用创建者时,就会出现问题。显然,JDO 认为这两家公司的地址属于用户而不是公司,并记录了以下错误:
address is mapped as a 1 to 1 relationship but there is more than one enity of kind Address that is a child of User(email@email.com)
用户的关键是
User(email@email.com)
公司的关键是
User(email@email.com)\Company(1)
两个地址的键是
User(email@email.com)\Company(1)\Address(1)
User(email@email.com)\Company(1)\Address(2)
我对分层数据库很陌生,所以我想知道为什么这两个地址被持久化/解释为用户的孩子而不是用户的后代和公司的孩子。对于这种情况,正确的层次结构是什么?谢谢。