0

Objectify4 を自分のプロジェクトで動作させたとします (まだ動作させる作業を行っていますが) エンティティを Map フィールドで次のように永続化することは可能ですか?

class Foo {
  Map<String, Object> map; 
  public Foo() {}
  public Foo(Map map) {
   this.map = map;
  }
}

基本的な考え方は、「ジェネリック」フィールドを保存/永続化できるようにすることです。

  • java.lang.String
  • java.lang.Number
  • java.lang.ブール値
  • ヌル
  • java.util.List
  • java.util.Map

たとえば、これを保存できます:

map.put("uid:sarah:fname", "Sarah");
persist(new Foo(map));

または

map.put("uid:sarah:age", 25);
persist(new Foo(map));

これはObjectifyでも可能ですか? またはApp Engine?

4

1 に答える 1

1

これは、Objectify4でそのまま機能しますが、いくつかの注意点があります。

  1. '。'は使用できません。キー名の文字
  2. Object値はまったく変換されません。データストアが受け入れるものは何でもかまいません。

1は、これが未加工のエンティティに次のように格納されるためですfield.keyname(埋め込みフィールドを区切る「。」の複数のレイヤーが含まれる可能性があります)。

2は、タイプ情報を削除するため、Objectifyはオブジェクトをそのまま処理するためです。低レベルのAPIを直接使用しているようなものです。保存できるのは、プリミティブまたはプリミティブのコレクションのみです。アレイもマップもありません。コレクションは常にリストとして返されます。数値は、格納されているサイズに関係なく、常にLongとして返されます。他にも風変わりな振る舞いがいくつかあります。

この動作が本当に必要な場合は、実行時に型をイントロスペクトし、必要なことをほぼすべて実行するカスタムTranslatorFactoryを作成できます。ただし、これはかなり進んでおり、既存の翻訳者の調査が必要になります。Googleグループでお手伝いします; stackoverflowは、おそらくこの議論に適した場所ではありません。

于 2012-09-25T16:57:09.230 に答える