一度に作成された2つの永続化可能なクラスの間に所有されていない関係を持ちたいです。私のアプリでは、永続化したい2つのインスタンスが同じエンティティグループに永久に残ることを実際に保証できないため、関係は所有されていない必要があります。私の関係は双方向の1対多です:
// in first class
@Persistent
private Set<Key> instancesOfSecondClass;
// in second class
@Persistent
private Key instanceOfFirstClass;
次に、1回のサーブレットdoPost()
呼び出しで、これらのクラスごとに1つのインスタンスを永続化する必要があります。私は実際に関係の両側を維持するための素晴らしい方法を作りました。まず、Key
ID(私は…</p>を使用します
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key id;
…どこでも主キーとして)がファーストクラスのセットに追加され、次にコンビニエンスメソッドがセカンドクラスのインスタンスで呼び出され、この変更を通知し、それに応じて1つのKeyプロパティを更新し、古い値、nullチェックなどを比較します。実際、インスタンスが新しいときはまだKeyを持っていないので、最初に両方を呼び出して永続化し、次に割り当てを実行して、後で発生するpm.makePersistent()
のを待つ必要があります。pm.close()
しかし、実際に起こることは、かなり混乱しています。サーブレットを実行した後(その唯一の目的はKey
、これら2つのインスタンスのシリアル化されたを他の場所で使用するために返すことです)、データストアビューアを確認して、次のことを確認します。
- ファーストクラスのインスタンスが永続化されました(実際には、インスタンスを呼び出した瞬間
NullPointerException
から、ここでもう1つの問題が発生します)org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.postInsert(PersistenceCapableMapping.java:1039)
pm.makePersistent()
Set<Key>
- 2番目のクラスのインスタンスが永続化されました(これまでのところ良好です)
- 2番目のクラスのインスタンスには
Key
、最初のインスタンスへの参照が永続化されています。 - 最初のインスタンスのキーのセットは…それを待つ…空
ローカルデータストアは空のスペースを表示しますが、オンラインのデータストアは<null>
クラスのコンストラクター(引数を持つコンストラクター)がリレーションの新しいインスタンスを作成しますが、を表示しますHashSet<T>
。
Google App Engine for Java 1.6.4の使用は、1.6.3でも発生しました。
これを解決するために丸一日を費やし、トランザクションを間に置き、2つPersistenceManager
のを使用して、呼び出しを永続化する順序を変え、グループ間トランザクションを有効にしましたが、何も役に立ちませんでした。
一般的に、矛盾の可能性に関係なく、2つの別々のエンティティグループに2つのインスタンスを作成して更新するための実用的な方法を見つけて、それらの間に所有されていない関係を見つけたいと思います(更新の頻度に基づいて、それほど心配する必要はありません) )。
その間に、さらに2つの可能な解決策を見つけましたが、まだ試していません。1. 2つだけでなく4PersistenceManager
つを作成します(1つは最初のインスタンスを作成し、2つ目は2番目のインスタンスを作成し、3つ目は関係の片側を更新します) 、4番目に関係の2番目の側を更新する)、または2.インスタンスを切り離し、更新後に再び永続化する。今どちらに行くべきかわからない。