我正在使用 Eclipselink,并且有一个 JPA 实体,它基本上是作为 blob 存储在数据库中的 gzip 数据的字节数组。然而,这些数据被包装在一个管理字节数组并可以正确解码的类中(GzipByteArray)。我使用 @Converter 和 @Convert 注释从数据库中的内部 byte[] 数组转换为我的 GzipByteArray 包装类。实体实际上将 GzipByteArray 类存储为变量类型。一切正常。
但是,当我想将一些文本附加到 GzipByteArray 时,我会调用它的方法来附加文本。 Eclipselink 未检测到父实体类的此参数的更改。
我在 GzipByteArray 上放置了 .equals() 和 .hashCode() 方法,以确保它考虑到内部 byte[] 数组中的更改。那没有帮助。根据我的日志记录,Eclipselink 甚至没有调用 .equals()。
我能够检测到更改的唯一方法是创建一个新的 GzipByteArray 实例并使用 setter 来修改它。
我假设 Eclipselink 使用默认的 DeferredChangeDetectionPolicy 。这是如何运作的?我什至下载了Eclipselink的源代码,但我无法弄清楚。我可以以某种方式手动强制该字段被标记为“脏”吗?对象的实例 ID 是否必须更改才能让 Eclipselink 检测到它?
最佳答案
在您的转换器中,您需要为 isMutable() 返回 true,这将确保 EclipseLink 使用延迟更改检测。您还可以将 @Mutable 添加到您的映射中。
如果可能的话,在更改值时调用 set 方法而不是使用 mutable 会更高效。这将允许 EclipseLink 使用属性更改跟踪,而不必在每次提交时比较整个字节数组的更改。
关于java - Eclipselink 未将更新保存到实体内的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10621176/