1

GoogleAppEngineでホストされているアプリケーションのデータアクセスレイヤーとしてObjectifyを使用しています。

マップを永続化しようとすると問題が発生します。私の豆は次のようになります。

@Entity
@Cached
class MyBean{
    @Id 
    private Long id;
    @Embedded
    Map<String, String> parameters = new HashMap<String, String>();

    public MyBean(){}

    //getters and setters below
}

まず、マップの「パラメータ」はプライベートではなく、JRE例外をスローしていたことに注意してください。マップを保存すると、すべてがうまくいきます。データストアから取得すると失敗します。

私の回避策は、@Serializedアノテーションを使用することです。私が達成したいのはGAEデータストアのエキスパンド機能を使用することなので、これは単なる回避策です。

objectify docによると、私は正しい操作を行っています。

例外の詳細:

原因:com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364)のjava.lang.NullPointerException(com.googlecode.objectify.impl.load.EmbeddedMapSetter.safeSet(EmbeddedMapSetter.java:65)) .googlecode.objectify.impl.load.C​​ollisionDetectingSetter.set(CollisionDetectingSetter.java:37)at com.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:359)at com.googlecode.objectify.impl.Transmog.load (Transmog.java:340)at com.googlecode.objectify.impl.ConcreteEntityMetadata.toObject(ConcreteEntityMetadata.java:203)at com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:668)atcom。 googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:657)at com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator。java:35)

4

2 に答える 2

4

埋め込まれたマップはObjectify3で十分にサポートされておらず、公に発表されるべきではありませんでした。@Embedded Mapのセクションは、Objectify3のドキュメントから削除されました。

Objectify4は、次のエキスパンドスタイルのマップを含むマップを広範囲にサポートします。

  • マップ(または任意のプリミティブ)
  • マップ(主要な参照)
  • マップ(埋め込みクラス

さらに、@ Mapifyアノテーションがあり、オブジェクトの通常のコレクションを取得し、1つのプロパティをキーとして選択し、それをマップとして保存できます。

残念ながら、Objectify4のドキュメントは現時点では準備ができていません。ただし、ソースコードは複数の関係者によって積極的に使用されています。大胆に感じる場合は、トランクから構築してください。

于 2012-02-07T02:54:49.633 に答える
0

また、Objectify 4 を使用することをお勧めします。アプリをアップグレードしたところ、かなり簡単に実行できることがわかりました。特に Map 型のフィールドのサポートが非常に気に入っています。

質問に答えるために、@Embeddedプリミティブのみを含む配列に置くべきではありません。@EmbeddedString は Google App Engine データストアではプリミティブであるため、マップで指定する必要はありません。

于 2012-02-07T12:52:39.943 に答える