Google app engine 谷歌应用引擎:存储无主多对多关系

Google app engine 谷歌应用引擎:存储无主多对多关系,google-app-engine,persistence,jdo,Google App Engine,Persistence,Jdo,我有两个对象,一个是用户,一个是角色,我使用JDO和Google应用程序引擎使其持久化。这两种数据类型作为无主多对多关系相互关联。我试图建模,就像在gae教程中描述的那样,描述为持有相应对象的键的集合。当我创建我的对象时,这些键是空的。所以为了生成一些键,我让这些对象持久化。之后,我将引用键添加到这些对象。但是,这些密钥最终没有被存储 除了设置键之外,我还操作一些其他属性(在makePersistent之后)。这些更改稍后将反映在数据存储中。但是,我在makePersistent之后所做的所有关

我有两个对象,一个是用户,一个是角色,我使用JDO和Google应用程序引擎使其持久化。这两种数据类型作为无主多对多关系相互关联。我试图建模,就像在gae教程中描述的那样,描述为持有相应对象的键的集合。当我创建我的对象时,这些键是空的。所以为了生成一些键,我让这些对象持久化。之后,我将引用键添加到这些对象。但是,这些密钥最终没有被存储

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

下面是一些示例代码,用来解释这个问题

存储这些钥匙的最佳做法是什么

持久角色类

public class Role {

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

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

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

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

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

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

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

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

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

JDO提供了一个到 对象的持久性。JDO 1.0 不提供一种采取行动的方式 对象,该对象刚刚被持久化并 只需对其进行操作并更新 稍后保存对象。用户有 手动复制字段并复制 将它们返回到持久化对象 稍后。JDO 2.0引入了一种新的 通过分离来处理这种情况 持久性图中的对象, 允许它在 用户应用程序。那就可以了 附加到持久性图 稍后


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

JDO提供了一个到 对象的持久性。JDO 1.0 不提供一种采取行动的方式 对象,该对象刚刚被持久化并 只需对其进行操作并更新 稍后保存对象。用户有 手动复制字段并复制 将它们返回到持久化对象 稍后。JDO 2.0引入了一种新的 通过分离来处理这种情况 持久性图中的对象, 允许它在 用户应用程序。那就可以了 附加到持久性图 稍后


没有人知道如何回答这个简单的问题?似乎GAE并不像谷歌和VMWare希望的那样受欢迎……没有人知道如何回答这个简单的问题?似乎GAE不像谷歌和VMWare希望的那样受欢迎。。。