2016-09-28 59 views
0

我有一個Java的App Engine應用程序持久化類像這樣:可以將App Engine數據存儲的@Persistent字段更改爲非@持久性?

@PersistenceCapable 
public class SomeClass { 

    // <snip> some fields 

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

而一直工作到現在,但在圖中的數據過於龐大,並打算在App Engine的1MB限制。

源數據位於blob中,因此我不會保留計算的地圖數據,而是在源數據塊需要訪問dataMap時重新計算 - 它會比較慢,但可以容納更大的實體。

但是,爲此,我希望保留該字段,但要告訴App Engine它不再持久(即不要試圖填充數據存儲區中的數據),以便我可以基於blob數據自行填充它。

如果我刪除@Persistent - 加載以前保存的實體時,我得到的錯誤:

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

看起來像在數據存儲中的數據是試圖通過吸氣被設置爲分類(無好處的序列化註釋)。我認爲,如果該字段未標記爲持久性,則不會將數據存儲的數據應用於該字段。

這是預期的行爲還是錯誤?應該怎麼做,我是否需要首先從數據存儲區中的每個實體中刪除地圖數據?我是否需要將字段名稱更改爲newDataMap?

編輯:我測試了字段名稱(相同的setter/getter名稱)並修復了錯誤,因此當App Engine應用數據存儲區數據時,似乎與數據存儲區數據中的字段匹配的字段名稱非常重要,而不是註釋。

回答

0

訣竅是專門註釋這些字段爲@NotPersistent我錯過了the docs,但默認是嘗試並持續存在。

相關問題