我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现。我也在使用 MySQL 数据库。我在使用可为空的 Date 属性更新对象时遇到问题。当我尝试合并实体并将 Date 属性设置为 null 时,不会生成任何 sql 更新脚本(或者当其他字段被修改时,会生成 sql 更新脚本,但会从中省略日期字段)。如果日期字段设置为其他一些非空值,则会正确生成更新脚本。
有人遇到过这样的问题吗?
最佳答案
当您分离(并可能序列化)一个实体然后将其合并回时,OpenJPA 会做出某些假设。
通常是序列化引发了此类问题 - 当实体被序列化时,OpenJPA 会丢失其跟踪哪些字段已加载的 StateManager。因此,当您使用空值将实体合并回时,OpenJPA 不确定该字段是否曾经加载过并且认为它没有被更改。
有几个选项可以解决这个问题:
您可以将 OpenJPA 配置为使用可序列化的 StateManager - 它会跟踪您加载了哪些字段。为此,将以下属性添加到 persistence.xml。
<property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/>
或者告诉 OpenJPA 在分离实体之前加载一组字段。然后 OpenJPA 将知道存在哪些字段并将正确处理空值。您的选择是加载获取组(一个 OpenJPA 概念,但默认情况下它加载所有非 LAZY 字段)或每个字段(这可能很昂贵)。
在大多数情况下,我建议使用 fetch-groups,这是 persistence.xml 的属性。
<property name="openjpa.DetachState" value="fetch-groups"/>
如果您愿意,可以使用分离的对象图做一些聪明的事情。 OpenJPA 手册在 http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#ref_guide_detach_graph 上有更多信息。
关于java - Nullable Date 列合并问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453671/