Eclipselink 不保存对实体内字段的更新



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

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

我在 GzipByteArray 上放了一个 .equals(( 和 .hashCode(( 方法,以确保它考虑了内部 byte[] 数组的变化。这无济于事。根据我的日志记录语句,.equals(( 甚至没有被 Eclipselink 调用。

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

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

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

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

最新更新