【问题标题】:Nullable Date column merge problem可空日期列合并问题
【发布时间】:2011-01-28 01:28:50
【问题描述】:

我在 Geronimo 应用服务器上使用 JPA 和下面的 openjpa 实现。我也在使用 MySQL 数据库。我在使用可为空的 Date 属性更新对象时遇到问题。当我尝试将 Date 属性设置为 null 的实体合并时,不会生成 sql 更新脚本(或者当修改其他字段时,会生成 sql 更新脚本,但会省略日期字段)。如果日期字段设置为其他非空值,则会正确生成更新脚本。

有人遇到过这样的问题吗?

【问题讨论】:

    标签: java jpa merge openjpa geronimo


    【解决方案1】:

    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 上有更多信息

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2014-09-10
      相关资源
      最近更新 更多