App Engine数据存储的@Persistent字段是否可以更改为非@Persistent?

时间:2016-09-28 11:19:27

标签: java google-app-engine

我在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应用数据存储区数据时,似乎与数据存储区数据中的字段匹配的字段名称是重要的,而不是注释

1 个答案:

答案 0 :(得分:0)

诀窍是专门将字段注释为@NotPersistent我在the docs中错过了它,但默认是尝试并保留。