0

我有三个实体用户、公司和地址,声明如下:

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

我对分层数据库很陌生,所以我想知道为什么这两个地址被持久化/解释为用户的孩子而不是用户的后代和公司的孩子。对于这种情况,正确的层次结构是什么?谢谢。

4

1 回答 1

0

您使用的是什么版本的应用引擎 sdk?周一,他们发布了一个新版本,其中包含许多针对 JDO 问题的修复。(发行说明)有四个或五个修复与对象之间的关系有关,所以这个问题可能已经解决,或者以一种新的方式解决了:) OTOH,你的问题可能与这个未解决的问题有关

我对分层数据库很陌生,所以我想知道为什么这两个地址被持久化/解释为用户的孩子而不是用户的后代和公司的孩子。

您看到的密钥层次结构基于实体组。就数据存储而言,您可以让您的公司在与用户不同的实体组中,从而产生如下的关键结构:

User(email@email.com)
Company(1)\Address(1) 
Company(1)\Address(2)

数据存储不一定知道一对一映射或一对多映射。它只是让您可以随意引用其他实体的键。但是,JDO 层会自动将所有拥有关系的实体放入同一个实体组中,大概是这样它可以强制以事务方式发生更改。

说了这么多,你的结构在我看来还不错。看起来 JDO 层只是检查属于 Kind Address 的任何实体组后代,而不是专门寻找属于 Company 的直接子代的实体组。

于 2009-07-17T18:24:18.110 回答