2012-05-16 34 views
0

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

然而,当我要追加一些文本到GzipByteArray,我呼吁它的方法,以文本追加。 Eclipselink未检测到父实体类的此参数的更改。

我把我的GzipByteArray一个.equals()和.hashCode()方法,以确保它考虑到了内部byte []数组中的变化。这没有帮助。根据我的日志记录,eclipselink甚至不会调用.equals()。

我能到被检测的改变的唯一方法是创建GzipByteArray的新实例,并使用setter方法来修改它。

我假设的EclipseLink使用默认DeferredChangeDetectionPolicy。这个怎么用?我甚至下载了Eclipselink的源码,但我无法弄清楚。我可以手动强制这个领域被标记为“脏”不知何故?对象的实例ID是否必须更改以便Eclipselink检测它?

回答

0

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

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

+0

我试过两种方法。如果您在转换器中将isMutable()设置为true,或者使用@Mutable标记,它将起作用。为了清晰起见,我设置了两个。 在我的情况下,我真的想以一种流式的方式将一些文本附加到我的GzipByteArray中,而不必构造一个新的实例。 谢谢! –

相关问题