【问题标题】:Eclipselink does not detect a dirty entityEclipselink 未检测到脏实体
【发布时间】:2023-03-20 00:14:02
【问题描述】:

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

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

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

谢谢, 啾啾

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

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

    【讨论】:

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