为什么即使值没有改变,JPA 也会将对象标记为脏对象?

Fre*_*eit 2 java jpa eclipselink

我正在开发一个有时会调用 JPA 托管实体上的 setter 的应用程序。为什么即使值没有改变,JPA 也会将这些对象标记为脏对象?

例如,我有一个对象,它有一个子对象。我可以打电话entity.setMyChild(entity.getMyChild()),JPA 显然仍然将该实体视为脏实体并将更新它。

Ste*_*n C 5

您需要与编写规范(和实现)的人交谈以获得明确的答案,但我可以想到一些合理的原因。

  • 如何判断新旧值没有变化?

    • 您可以调用equals(Object)(对于对象类型)!但用于equals此目的“合理”吗?那些对平等没有贡献但仍需要坚持的领域呢?

    • 您可以使用对象标识。但是,如果应用程序随意创建“相等”实例怎么办?

    简而言之,很难对“价值改变”给出一个合适的定义。

  • 费用怎么样?为了使“仅在更改时设置为脏”起作用,您需要在每次调用时比较新旧值set。假设我们使用了equals(Object). 考虑到该set调用可能会进行多次,并且调用的成本equals(Object)可能很高,我们可能会遇到严重的性能问题。

我怀疑他们会考虑这种事情,并决定更简单的“设置意味着肮脏”模型会更容易使用。

无论如何,如果您不喜欢 JPA 在这种情况下的工作方式,您始终可以在持久对象的 API 中添加另一个 setter 方法,该方法仅在新值不同时调用 JPA setter ...根据某些模型。