0

クラスリテラルをフィールドとして持つPOJOがある場合、それをObjectifyで永続化できますか?

private Class<Foo> fooType;

これらのドキュメントは別のことを示唆しているようですが、私は確認するだけだと思いました:

http://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify

https://developers.google.com/appengine/docs/java/datastore/entities#Properties_and_Value_Types

4

2 に答える 2

3

デフォルトでは、いいえ。ただし、クラスを文字列としてネイティブにデータストアに格納するトランスレータを簡単に追加できます。保存時に Class.getName() を使用し、ロード時に Class.forName() を使用します。

Objectify3 で行うことの例を次に示します。

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/DateTimeZoneConverter.java

タイプがコンバーターに関連しない場合、個々のコンバーターで null を返すことに注意してください。有効にする方法は次のとおりです。

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/JodaTimeConverters.java

これは Objectify4 での同等のものです。

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/DateTimeZoneTranslatorFactory.java

有効にする方法は次のとおりです。

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/JodaTimeTranslators.java

于 2012-04-04T16:28:37.987 に答える
1

Objectify は、GAE Datastore でサポートされているタイプのみを保持できます。Java 型Classはその 1 つではありません。

また、型 eraseにより、 fieldfooTypeは一般的な引数情報を保持しません。

現在、Classタイプを保存するにはいくつかの方法があります。

  1. クラスの長い名前のみを保存し、@PrePersist/@PostLoad を介して変換します。これの利点は、クエリできる通常の文字列プロパティを取得できることです。

    @Transient // tells Objectify to ignore field
    public Class<Foo> fooType;
    
    @PrePersist
        public prePersist(Entity entity){
        entity.setProperty("fooType", fooType.getName())
    }
    
    @PostLoad
    public postLoad(Entity entity){
       fooType = Class.forName(entity.getProperty("fooType"));
    }
    
  2. をシリアル化しますClass(これが実装されているためSerializable、許可されています)。これは、Java シリアライゼーションを使用して、フィールドを Blob (最大 1Mb サイズ) として保持します。これは単純な解決策ですが、プロパティがインデックス化されておらず、クエリで使用できないという欠点があります。

    @Serialize
    private Class<Foo> fooType;
    
于 2012-04-04T16:20:11.183 に答える