2016-09-28 12 views
0

私はこのようなJavaのApp Engineアプリケーションに永続クラスを持っている:App Engineデータストアの@ Persistentフィールドを@ Persistentに変更できますか?

@PersistenceCapable 
public class SomeClass { 

    // <snip> some fields 

    @Persistent(serialized="true") 
    private Map<String, String> dataMap = new HashMap<>(); 
} 

今まで取り組んできましたが、マップ内のデータが大きすぎる取得し、App Engineの1MBの制限を超えて起こっています。

ソースデータはBLOBなので、計算されたマップデータを保持するのではなく、dataMapにアクセスする必要があるときにソースBLOBから再計算します。遅くなりますが、もっと大きなエンティティに対応できます。

しかし、フィールドを維持したいが、App Engineに永続的ではない(つまり、データストアからデータを取り込もうとしない)ようにして、ブロブデータに基づいて自分自身を設定できるようにしてください。

私は@Persistentを削除する場合 - 以前に保存されたエンティティをロードするとき、私はエラーを取得する:データストア内のデータは利益なし(ゲッターを経由してクラスに設定されるようにしようとしているよう

java.lang.ClassCastException: com.google.appengine.api.datastore.Blob cannot be cast to java.util.Map 
in .jdoReplaceField() 

が見えますシリアライズされた注釈の)。私は、フィールドにPersistentとマークされていないと、データストアのデータがそのフィールドに適用されないと考えました。

これが期待どおりの動作またはバグですか?これをどうすればよいですか?最初にデータストア内のすべてのエンティティから地図データを削除する必要がありますか?フィールド名をnewDataMapなどに変更する必要がありますか?

編集:フィールド名(同じセッター/ゲッター名)をテストしたので、App Engineがデータストアデータを適用しているときに、データストアデータのフィールドに一致するフィールド名が問題ではないようです注釈。

答えて

0

トリックは@NotPersistentというフィールドに特に注釈を付けることでしたが、私はthe docsでそれを見逃していましたが、デフォルトでは試してみてください。

関連する問題