java - Nullable Date 列合并问题

标签 java jpa merge openjpa geronimo

我在 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/

相关文章:

java - 如何在JPA Spring boot中区分?

jpa - Glassfish 中的 LAZY 关系实例化问题

java - 将相邻的矩形合并为一个多边形

java - 什么是 J9VMInternals,它是如何工作的?

java - 使用 Netbeans 7.1 和 Synthetica 拉伸(stretch)选项卡

design-patterns - 将 SQL View 映射到 JPA 实体

linux - 从具有公共(public)(未排序)列的两个文件创建新文件

java - Curl 到 Java httpclient

Java Swing - 条件 SQL 查询

python - 合并两个具有相同列的相似数据框