2012-05-16 36 views
0

裏面我使用的EclipseLink,我有一個JPA實體,基本上是存儲在數據庫中的BLOB數據gzip壓縮的字節數組。但是,這些數據被封裝在一個管理字節數組的類中,並且可以正確解碼(GzipByteArray)。我使用@Converter和@Convert註釋將數據庫中的內部byte []數組轉換爲我的GzipByteArray包裝類。實體實際上將GzipByteArray類存儲爲變量類型。這一切工作正常。的EclipseLink不保存更新到一個領域的實體

然而,當我要追加一些文本到GzipByteArray,我呼籲它的方法,以文本追加。 Eclipselink未檢測到父實體類的此參數的更改。

我把我的GzipByteArray一個.equals()和.hashCode()方法,以確保它考慮到了內部byte []數組中的變化。這沒有幫助。根據我的日誌記錄,eclipselink甚至不會調用.equals()。

我能到被檢測的改變的唯一方法是創建GzipByteArray的新實例,並使用setter方法來修改它。

我假設的EclipseLink使用默認DeferredChangeDetectionPolicy。這個怎麼用?我甚至下載了Eclipselink的源碼,但我無法弄清楚。我可以手動強制這個領域被標記爲「髒」不知何故?對象的實例ID是否必須更改以便Eclipselink檢測它?

回答

0

在你的轉換器,你需要爲isMutable(返回true),這將確保EclipseLink的使用延遲變化檢測。您還可以將@Mutable添加到您的映射中。

如果可能,如果在更改值而不是使用mutable時調用set方法,則效率更高。這將允許EclipseLink使用屬性更改跟蹤,而不必在每次提交時比較整個字節數組。

+0

我試過兩種方法。如果您在轉換器中將isMutable()設置爲true,或者使用@Mutable標記,它將起作用。爲了清晰起見,我設置了兩個。 在我的情況下,我真的想以一種流式的方式將一些文本附加到我的GzipByteArray中,而不必構造一個新的實例。 謝謝! –

相關問題