我在Java App Engine应用程序中有一个持久化类,例如:
@PersistenceCapable
public class SomeClass {
// <snip> some fields
@Persistent(serialized="true")
private Map<String, String> dataMap = new HashMap<>();
}
到目前为止一直有效,但地图中的数据变得太大,超过了App Engine 1MB的限制。
源数据是blob,因此我不会持久计算地图数据,而是在需要访问dataMap时从源blob重新计算 - 它会变慢,但可以容纳更大的实体。 / p>
但是,要做到这一点,我希望保留该字段,但告诉App Engine它不再持久(即不要尝试从数据存储区填充数据),以便我可以根据blob自己填充它数据
如果我删除@Persistent
- 加载以前保存的实体时,我收到错误:
java.lang.ClassCastException: com.google.appengine.api.datastore.Blob cannot be cast to java.util.Map
in .jdoReplaceField()
看起来数据存储中的数据正在尝试通过getter设置到类中(没有序列化注释的好处)。我认为如果该字段未标记为Persistent,则不会从数据存储区中应用数据。
这是预期的行为还是错误?如何做到这一点,我是否需要首先从数据存储区中的每个实体删除地图数据?我是否需要将字段名称更改为例如newDataMap?
编辑:我测试了字段名称(相同的setter / getter名称)并修复了错误,因此当App Engine应用数据存储区数据时,似乎与数据存储区数据中的字段匹配的字段名称是重要的,而不是注释