与拥有一对一的关系,父/子关系问题
-
16-09-2019 - |
题
我有三个实体的用户,公司,并用像这样的声明地址:
@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)
我是很新,层次数据库,所以我在想,为什么这两个地址都坚持/解释为用户的孩子而用户的后裔和公司的儿童。什么是这样的情况下正确的层次结构?感谢。
解决方案
什么版本的应用程序引擎SDK您使用的是?周一他们发布一个新的,包括很多修复JDO问题。 (发行说明)四个或修复,有5个与之间的关系做对象,因此有可能这个问题已经解决了两种,或者以新的方式打破:) OTOH,您的问题可能与这个开放的票。
我是很新,层次数据库,所以我在想,为什么这两个地址都坚持/解释的用户,而不是公司的用户后裔和儿童。
您所看到的密钥层次是基于实体组。随着至于数据存储而言,你可以有你的公司在不同的实体组不是用户,造成这样的关键结构:
User(email@email.com)
Company(1)\Address(1)
Company(1)\Address(2)
数据存储不一定知道一对一的映射,或一对多映射。它只是让你参考其他实体的按键,只要你喜欢。然而,JDO层自动将所有实体在一个拥有关系到相同的实体组,想必所以它可以强制改变以事务的方式发生。
使用所有这样说,你的结构看起来不错给我。它看起来像JDO层只是检查任何实体组后代是类型的地址,而不是专门针对一个是公司的直接孩子看。
不隶属于 StackOverflow