如何为组实体生成密钥?

时间:2010-04-27 02:19:02

标签: google-app-engine

我正在尝试建立一个团体实体。类似的东西:

class User {
}

class UserColor {
}

...

Key key = new KeyFactory.Builder(
  User.class.getSimpleName(), username).
    .addChild(UserColor.class.getSimpleName(), ???).getKey();

我知道用户对象密钥的唯一用户名。但我只想让app引擎为UserColor实例的键值生成一个随机唯一值。

我认为这里有描述,但我不明白他们的措辞: http://code.google.com/appengine/docs/java/datastore/transactions.html

  

要使用系统生成的数字ID和实体组父对象创建对象,必须使用实体组父键字段(例如上面的customerKey)。将父键的键分配给父键字段,然后将对象的键字段设置为null。保存对象后,数据存储区将使用完整密钥填充密钥字段,包括实体组父级。

这是他们的榜样:

@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private Key customerKey;

但我不明白 - 如果UserColor看起来像这样吗?:

class UserColor {
    @Persistent
    @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
    private Key mKeyParent;

    @Primary
    private Key mKey; // leave null
}

...

Key keyParent = new KeyFactory.Builder(
  User.class.getSimpleName(), username);

UserColor uc = new UserColor();
uc.setKeyParent(keyParent);
pm.makePersistent(uc); // now generated for me automatically?

是正确的吗?使用这种方法,我应该能够在事务中一起使用User和UserColor对象,对吧?

由于

1 个答案:

答案 0 :(得分:0)

正确,你的第二个例子是正确的想法。它允许您在同一事务中使用User及其子UserColor。

另外,如果用户具有您提到的密钥名称,则您应该能够在事先没有任何实体存在于数据存储区中的情况下运行该事务。但是,如果用户实体将具有基于ID的密钥,则您需要先将其存储,以便获得分配的ID。