我有三个实体的用户,公司,并用像这样的声明地址:

@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层只是检查任何实体组后代是类型的地址,而不是专门针对一个是公司的直接孩子看。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top