Eclipselink 未检测到脏实体

Posted

技术标签:

【中文标题】Eclipselink 未检测到脏实体【英文标题】:Eclipselink does not detect a dirty entity 【发布时间】:2012-10-29 11:59:34 【问题描述】:

我正在尝试使用 eclipselink。我正在尝试更新数据库中的现有实体。 JPA 实体只有公共字段,并且字段使用 JPA 注释进行注释。该代码使用EntityManager.find() 加载实体。

代码创建一个 JPA 实体实例,为实体的公共字段赋值,并调用 EntityManager.merge(entity) 方法。 Eclipselink 不更新数据库记录。我启用了日志以查看 Eclipselink 是否发出 SQL 语句。

Eclipselink 不发布任何更新声明。这是否意味着即使我使用了字段持久化,我也不能为实体的公共字段赋值而不是使用setter方法?

谢谢, 啾啾

【问题讨论】:

【参考方案1】:

Weaving 引入了一些优化,例如惰性 onetoone 和 manytones 以及更改跟踪。这些可以工作的唯一方法是如果您在实体上使用访问器方法,但如果这不是一个选项,您可以根据需要关闭它们。看 http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_changetracking.htm 有关更改跟踪的详细信息。

【讨论】:

感谢 Chris,如果在 JavaSE 环境中使用 JPA,它会检测对实体的公共或私有字段所做的更改并更新数据库。但在 JavaEE 环境中同样行不通。 Weaving 与容器集成在一起,而在 javaSE 中,它需要在启动时挂接代理。没有编织意味着它必须使用延迟更改检测,这会为比较创建备份。虽然编织默认为属性更改跟踪,但要求应用程序使用访问器才能注册更改。如果您不能使用访问器,则需要指定不同的更改检测策略。请注意,JPA 规范实际上只允许使用访问器从外部获取实体,因此其他一些功能(例如基础知识的延迟加载)可能也不起作用。

以上是关于Eclipselink 未检测到脏实体的主要内容,如果未能解决你的问题,请参考以下文章

EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null

JPA 更新日期时间戳

Eclipselink 实体持续存在问题

EclipseLink + JPA + 通用实体 + SINGLE_TABLE 继承

Java JPA(EclipseLink)如何在持久化实际实体之前接收下一个 GeneratedValue?

JPA 使用指南 /Eclipselink/JPA 实体生成器