java - Eclipselink 未将更新保存到实体内的字段

标签 java jpa eclipselink

我正在使用 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/

相关文章:

java - Android:动画自定义 View

java - Spring webflux : keeping an EntityManager open during the whole process of a reactive request handling

hibernate - spring data jpa select 查询父类(super class)字段

java - 在 EclipseLink 2.7 中不选择更新

java - 用于一对多关系的 JPA IN 子句

java - 如何修改现有的 Java 邮件 MimeMessage 正文部分?

java - 如何使用 Spring Boot 从 gradle 获取应用程序版本和其他一些信息?

java - 如何监控 headless java进程?

java - 使用maven将persistence.xml放在库jar中的哪里?

java - 继承实体类的通用回调方法(@PostLoad..) - JPA EclipseLink