Google App Engine:存储多个与众不同的关系

时间:2010-07-18 00:34:15

标签: google-app-engine persistence jdo

我有两个对象,一个用户和一个角色,我使用JDO和谷歌应用引擎持久化。这两种数据类型彼此相关,因为许多关系都是无主的。我试图建模那么多,因为在gae-tutorial中被描述为持有相应对象键的集合。到我创建对象时,这些键为空。因此,为了生成一些密钥,我将这些对象保持不变。之后,我将引用键添加到这些对象。但是这些密钥最终没有存储。

除了设置键之外,我还操纵了一些其他属性(在makePersistent之后)。稍后的这些更改将反映在数据存储区中。但是,我在makePersistent之后做的所有关键更改都没有进入数据存储区。如果我在makePersistent之前设置这些键,它们就会被存储起来。但是,这不是解决方案,因为至少有一个对象在持久化之后必须在逻辑上接收密钥引用。

下面是一些示例代码,解释问题。

存储这些密钥的好习惯是什么?

可持续角色类

public class Role {

   @PrimaryKey
   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
   private Key Role_id;

   @Persistent
   private Set<Key> Users = new HashSet<Key>();
...
}

可持久用户类

public class User {

   @PrimaryKey
   @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
   private Key User_id;

   @Persistent
   private String EMail = null;

   @Persistent
   private Set<Key> Roles = new HashSet<Key>();
   ...
}

代码提取,创建1个角色和1个用户,并尝试在两侧设置密钥引用。他们的密钥更改不会在数据存储区中结束。但是,电子邮件地址的更改将写入数据存储。     ...

    PersistenceManager pm = PMF.get().getPersistenceManager();
    Role GlobalAdmin = new Role();
    User Daniel = new User();

    try {
        pm.makePersistent(GlobalAdmin);
        pm.makePersistent(Daniel);
    } catch (Exception e){
        System.out.println("Storing failed: " + e.getMessage());
    }

    GlobalAdmin.addUser(Daniel.getUser_id());
    Daniel.addRole(GlobalAdmin.getRole_id());
    Daniel.setEMail("a@b.com");

    pm.close();
...

2 个答案:

答案 0 :(得分:1)

我认为你应该阅读datanucleus的文档。这将解释您目前的解决方案。

http://www.datanucleus.org/products/accessplatform_1_1/jdo/attach_detach.html

  

JDO提供了一个接口   持久化对象。 JDO 1.0   没有提供一种方式   刚刚坚持的对象   只是努力并更新   以后持久化对象。用户有   手动复制字段并复制   他们回到持久化的对象   后来。 JDO 2.0引入了一种新的方式   处理这种情况,通过分离   持久性图中的对象,   允许它在   用户申请。它可以是   附加到持久性图   后面。

答案 1 :(得分:0)

我找到了解决问题的方法。当我想写这些键时,我必须分离这些键并在以后再次使它们持久化。我既不理解为什么必须这样做,也不会有更优雅的东西。但是,它证明了工作。

首先,这些类必须是可检测的:

  @PersistenceCapable(detachable = "true") 
  public class User {
  ...

在使对象持续存在之后,我将它们分离,设置我的密钥并将这些对象重新安装到商店......

    ...
    pm.makePersistent(GlobalAdmin);
    pm.makePersistent(Daniel);

    pm.detachCopy(GlobalAdmin);
    pm.detachCopy(Daniel);

    GlobalAdmin.addUser(Daniel.getUser_id());
    Daniel.addRole(GlobalAdmin.getRole_id());

    pm.makePersistent(GlobalAdmin);
    pm.makePersistent(Daniel);
    ...