0

現在、既存の Google AppEngine アプリケーションをマスター/スレーブ データストア (MSD) から新しい高レプリケーション データストア (HRD) に移行中です。アプリケーションは Java で書かれており、永続化のために Objectify 3.1 を使用しています。

私の古い (MSD) アプリケーションには、次のようなエンティティがあります。

public class Session {
  @Id public Long id;
  public Key<Member> member;
  /* other properties and methods */
}

新しい (HRD) アプリケーションでは、これを次のように変更しました。

public class Session {
  @Id public Long id;
  // HRD: @Parent is needed to ensure strongly consistent queries.
  @Parent public Key<Member> member;
  /* other properties and methods */
}

Session オブジェクトが親の Member オブジェクトと完全に一致している必要があります。

Google の HRD 移行ツールを使用してアプリケーション (の作業コピー) を移行すると、すべてのメンバーとセッションが存在します。ただし、Session オブジェクトのすべてのメンバー プロパティは null になります。どうやら、これらのプロパティは移行されていません。

Session オブジェクトの親を変更する準備はできていましたが、メンバー プロパティが null の場合、それは不可能です。誰かが私が間違っていることを説明できますか?この問題を解決できるかどうか?

4

1 に答える 1

1

@Id と @Parent は、基になるエンティティの「実際の」プロパティではありません。これらは、エンティティを定義するキーの一部です。Objectify はそれらを POJO のプロパティにマップします。

あなたが行おうとしている変換は、GAE のより複雑な問題の 1 つです。異なる親を持つエンティティ (たとえば、いくつかの値と null) は異なるエンティティであることに注意してください。別のキーがあります。たとえば、null の親を持つエンティティをロードし、親に値を設定してエンティティを保存しても、エンティティは変更されず、新しいエンティティが作成されます。古いエンティティを削除し、外部キー参照を更新する必要があります。

最善の策は、通常の「メンバー」フィールドを使用してデータをそのままインポートすることです。@Parent フィールドを使用することもできます (名前は何でも構いません。「実際の」プロパティではないため、いつでも名前を変更できます)。移行後、データを通過させます。

  1. 各セッションをロード
  2. null の親メンバーをチェックします。null の場合:
  3. parentMember を割り当ててエンティティを保存する
  4. 親メンバーが null のエンティティを削除する

これを行う場合は、外部キー参照に十分注意してください。

于 2012-09-16T20:49:05.130 に答える