JDO,无主关系和一次持久化多个对象

时间:2012-04-03 22:35:00

标签: google-app-engine jdo

我想在两个持久化功能的类之间建立一个无主关系,一次创建。这种关系必须是无主的,因为我的应用程序无法保证我想要保留的两个实例将永远保留在同一个实体组中。我的关系是双向的一对多:

// in first class
@Persistent
private Set<Key> instancesOfSecondClass;

// in second class
@Persistent
private Key instanceOfFirstClass;

然后,在一个servlet doPost()调用中,我需要为每个类保留一个实例。我实际上做了一个很好的方法来维护关系的两个方面。首先,Key id(我用...

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

...作为主键无处不在)被添加到第一类中的Set,然后在第二类的实例上调用一个方法来通知此更改并相应地更新一个Key属性,比较旧值,null检查和一切。事实上,当实例是新鲜的时候我还没有任何Key,所以我需要先用pm.makePersistent()调用来保留它们,然后执行赋值并等待pm.close()稍后发生。

但是,真正发生的事情是非常令人困惑的。在运行servlet之后(其唯一目的是返回这两个实例的序列化Key以供其他地方使用),我去检查数据存储区查看器并查看:

  • 第一堂课的实例得到了保留(实际上还有一个问题就是NullPointerExceptionorg.datanucleus.store.mapped.mapping.PersistenceCapableMapping.postInsert(PersistenceCapableMapping.java:1039)投掷pm.makePersistent(),此时我在Set<Key>的实例上调用了Key <null> })
  • 第二课的实例得到了坚持(到目前为止一直很好)
  • 第二个类的实例对第一个实例的HashSet<T>引用持久化,yay
  • 第一个实例上的一组键是......等待它......空

本地数据存储区只显示空白区域,而在线数据存储区显示PersistenceManager,即使我的类构造函数(带参数的构造函数)为该关系创建了一个新的PersistenceManager实例。

使用Google App Engine for Java 1.6.4,也发生在1.6.3中。

花了一整天的时间试图解决这个问题,将交易放在两者之间,使用两个{{1}},不同的持久呼叫顺序,跨组事务启用,没有任何帮助。

一般来说,我很乐意找到一种工作方式,在两个独立的实体组中创建和更新两个实例,它们之间具有无主关系,无论可能的不一致(根据频率不要太担心我可能的更新)。

与此同时,我发现了另外两个可能的解决方案,但还没有尝试过:1。不仅创建两个,而且创建四个{{1}}(一个创建第一个实例,第二个创建第二个实例) ,第三个更新关系的一方,第四个更新关系的第二方面),或2.分离实例并在更新后再次使它们持久化。不知道现在走哪条路。

1 个答案:

答案 0 :(得分:1)

插件的v2提供了“真正的”无主关系,之前不需要这个关键hackery。如果您设置了多个实体组标志,则可以在同一事务中保留双方,或者您可以将它们保持为非事务性。

只需查看想法http://code.google.com/p/datanucleus-appengine/source/browse/trunk/tests/com/google/appengine/datanucleus/jdo/JDOUnownedOneToManyTest.java

的测试

我无法控制他们的文档中的内容,只是代码中的内容; - )