2012-02-01 12 views
1

GoogleAppEngineホストアプリケーションでObjectifyをデータアクセスレイヤーとして使用しています。埋め込みマップをオブジェクト化できません。

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

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

    public MyBean(){} 

    //getters and setters below 
} 

まず、マップ 'parameters'はプライベートではなく、JRE例外がスローされています。 マップを保存すると、すべてがうまくいく。それをデータストアから取得すると失敗します。

私の回避策は、@Serialized注釈を使用することです。これは単なる回避策です。なぜなら、私が達成したいのは、GAE Datastoreのexpando機能を使用することです。

objectify docによれば、私は正しい操作をしています。

例外の詳細: com.googlecode.objectifyでcom.googlecode.objectify.impl.Transmog.loadSingleValue(Transmog.java:364) でjava.lang.NullPointerExceptionが:によって引き起こさ

。 impl.load.EmbeddedMapSetter.safeSet(EmbeddedMapSetter.java:65) でcom.googlecode.objectify.impl.load.C​​ollisionDetectingSetter.set(CollisionDetectingSetter.java:37) com.googlecode.objectify.impl.Transmogで。 loadSingleValue(Transmog.java:359) (com.googlecode.objectify.imp) l.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ファイル: で com.googlecode.objectify.impl.QueryImpl $ ToObjectIterator.translate(QueryImpl.java:657) で668) com.googlecode.objectify.util.TranslatingIterator.next(TranslatingIterator.java:35)

答えて

4

埋め込みマップはObjectify3でサポートされていなかったため、一般公開されるべきではありません。 @Embedded Mapのセクションは、Objectify3のドキュメントから削除されました。

  • 地図(または任意のプリミティブ)
  • マップ(キー参照)
  • 地図(組み込みクラス

で:

Objectify4は、これらはExpandoスタイルの地図をはじめ、広範囲のマップをサポートしていますさらに、@Mapifyアノテーションを使用すると、オブジェクトの通常のコレクションを取得し、キーとして1つのプロパティを選択し、マップとして保存できます。

残念ながら、Objectify4のドキュメントは現時点では準備ができていません。しかし、ソースコードは複数の当事者によって積極的に使用されています。あなたが大胆に感じたら、幹から造る。

+0

私は4ofy 4 libを得ることができるSVNリポジトリからappart別の場所はありますか? –

+0

はい、ここに:http://objectify-appengine.googlecode.com/svn/maven/com/googlecode/objectify/objectify/4.0a3/objectify-4.0a3.jar – stickfigure

+0

すべてがOfy4と甘い仕事をしています、ありがとう –

0

私はまた、Objectify 4を使用することをお勧めします - 私は私のアプリケーションをアップグレードし、かなり簡単にそれを見つけました。私は、Map型のフィールドのサポートを特に好みます。

質問に答えるには、@Embeddedをプリミティブのみを含む配列に配置しないでください。したがって、文字列はGoogle App Engine Datastoreのプリミティブなので、マップに@Embeddedを指定する必要はありません。

関連する問題