我正在使用 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 检测到它?