我在 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 将知道存在哪些字段并正确处理空值。您的选项是加载 fetch-groups(一个 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有更多信息