我在 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 http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#ref_guide_detach_graph
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)