【问题标题】:Google App Engine: Storing unowned many to many relationshipGoogle App Engine:存储无主多对多关系
【发布时间】:2011-03-17 11:22:36
【问题描述】:

我有两个对象,一个用户和一个角色,我使用 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();
...

【问题讨论】:

  • 没有人知道如何回答这个简单的问题吗?似乎 GAE 并不像 Google 和 VMWare 所希望的那样受欢迎......

标签: google-app-engine persistence jdo


【解决方案1】:

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

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

JDO 提供了一个接口 对象的持久性。 JDO 1.0 不提供采取的方式 刚刚持久化的对象和 只需处理它并更新 稍后持久化对象。用户有 手动复制字段并复制 他们回到持久对象 之后。 JDO 2.0 引入了一种新的方法 处理这种情况,通过分离 持久性图中的一个对象, 允许它在 用户应用程序。那么就可以 附加到持久性图 稍后。

【讨论】:

    【解决方案2】:

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

    所以首先这些类必须是可去除的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多