我想在一次创建的两个具有持久性的类之间建立无主关系。这种关系必须是无主的,因为我的应用程序不能真正保证我想要保留的两个实例将永远留在同一个实体组中。我的关系是双向的一对多:
// in first class
@Persistent
private Set<Key> instancesOfSecondClass;
// in second class
@Persistent
private Key instanceOfFirstClass;
然后,在一次 servletdoPost()
调用中,我需要为每个这些类保留一个实例。我实际上做了一个很好的方法来维持双方的关系。首先,Key
id(我用...</p>
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;
... 作为无处不在的主键)被添加到第一类的 Set 中,然后在第二类的实例上调用一个便捷方法来通知此更改并相应地更新一个 Key 属性,比较旧值、空检查和所有内容。事实上,当实例是新鲜的时,我还没有任何 Key,所以我需要先通过pm.makePersistent()
调用来保持它们,然后进行分配并等待pm.close()
稍后发生。
但是,真正发生的事情非常令人困惑。运行 servlet 后(其唯一目的是返回Key
这两个实例的序列化 s 以供其他地方使用),我去检查数据存储查看器并查看:
- 第一类的实例得到了持久化(实际上,在我调用实例的那一刻
NullPointerException
起,这里又出现了一个问题)org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.postInsert(PersistenceCapableMapping.java:1039)
pm.makePersistent()
Set<Key>
- 第二类的实例得到了持久化(到目前为止一切都很好)
- 第二类的实例对
Key
第一个实例的引用保持不变,是的 - 第一个实例上的键集是……等待它……为空
本地数据存储仅显示空白空间,而在线数据存储显示<null>
,即使我的类构造函数(带参数的构造函数)HashSet<T>
为关系创建了一个新实例。
使用 Google App Engine for Java 1.6.4,也发生在 1.6.3 中。
花了一整天的时间试图解决这个问题,将事务放在中间,使用两个PersistenceManager
s,不同的持久调用顺序,启用跨组事务,没有任何帮助。
一般来说,我很乐意找到一种工作方式来创建和更新两个独立实体组中的两个实例,它们之间存在无主关系,无论可能存在不一致(根据可能的更新频率,我不会那么担心) )。
同时,我发现了另外两种可能的解决方案,但还没有尝试过:1.不仅创建两个,而且创建四个PersistenceManager
(一个创建第一个实例,第二个创建第二个实例,第三个更新关系的一侧,第四次更新关系的第二方),或者 2. 分离实例并在更新后使它们再次持久化。现在不知道该走哪条路。