2

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

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

4

2 回答 2

3

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

  • 您如何确定旧值和新值没有改变?

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

    • 您可以使用对象标识。但是,如果应用程序创建“相等”的实例会怎样呢?

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

  • 费用呢?要使“仅在更改时设置为脏”起作用,您需要在每次set调用时比较旧值和新值。假设我们使用equals(Object). 考虑到set调用可能会被多次调用,并且equals(Object)调用可能很昂贵,我们可能会遇到严重的性能问题。

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

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

于 2013-07-01T17:58:23.763 回答
0

如果没有任何更改,EclipseLink 不会执行更新。生成的更新 SQL 是什么?您是否更改了子对象的 id,或者您有两个对象副本?

请包括您的所有代码和 SQL 日志。

于 2013-07-02T14:26:59.333 回答