私はこのような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がデータストアデータを適用しているときに、データストアデータのフィールドに一致するフィールド名が問題ではないようです注釈。