我在Geronimo应用服务器上使用JPA和openjpa实现。我也在使用MySQL数据库。我有一个问题,用可以为空的Date属性更新对象。当我尝试合并将Date属性设置为null的实体时,不会生成sql update脚本(或者当修改其他字段时,会生成sql update脚本,但是会从中省略日期字段)。如果将date字段设置为其他非空值,则会正确生成更新脚本。
有没有人有这样的问题?
答案 0 :(得分:5)
当您分离(并且可能是序列化)一个实体然后将其合并回来时,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
处提供了更多信息