1

我正在使用 Eclipselink,并且我有一个 JPA 实体,它基本上是一个 gzip 压缩数据的字节数组,作为 blob 存储在数据库中。但是,这些数据被包装在一个管理字节数组并可以正确解码的类(GzipByteArray)中。我使用 @Converter 和 @Convert 注释将数据库中的内部 byte[] 数组转换为我的 GzipByteArray 包装类。Entity 实际上将 GzipByteArray 类存储为变量类型。一切正常。

但是,当我想将一些文本附加到 GzipByteArray 时,我会在其上调用一个方法来附加文本。Eclipselink 未检测到对父实体类的此参数的更改。

我在我的 GzipByteArray 上放置了一个 .equals() 和 .hashCode() 方法,以确保它考虑到内部 byte[] 数组的变化。那没有帮助。根据我的日志记录,Eclipselink 甚至没有调用 .equals()。

我可以检测到更改的唯一方法是创建一个新的 GzipByteArray 实例并使用 setter 对其进行修改。

我假设 Eclipselink 正在使用默认的DeferredChangeDetectionPolicy。这是如何运作的?我什至下载了Eclipselink的源代码,但我无法弄清楚。我可以以某种方式手动强制将此字段标记为“脏”吗?对象的实例 ID 是否必须更改才能让 Eclipselink 检测到它?

4

1 回答 1

0

在您的转换器中,您需要为 isMutable() 返回 true,这将确保 EclipseLink 使用延迟更改检测。您还可以将 @Mutable 添加到您的映射中。

如果可能,在更改值时调用 set 方法而不是使用 mutable 会更有效。这将允许 EclipseLink 使用属性更改跟踪,而不必在每次提交时比较整个字节数组的更改。

于 2012-05-17T13:31:45.337 回答