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

时间:2013-07-01 17:30:10

标签: java jpa eclipselink

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

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

2 个答案:

答案 0 :(得分:3)

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

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

    • 您可以调用equals(Object)(对象类型)!但它是"声音"为此使用equals?那些不能为平等做出贡献的领域仍然需要坚持下去?

    • 您可以使用对象标识。但是,如果应用程序创建"等于" willy-nilly?

    简而言之,很难找到合适的定义"改变价值"。

  • 费用怎么样?对于"仅在更改时设置为脏"要工作,您需要比较每个set电话的新旧值。假设我们使用了equals(Object)。考虑set调用可以多次调用,equals(Object)调用可能很昂贵,我们可能会遇到严重的性能问题。

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

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

答案 1 :(得分:0)

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

请包含所有代码和SQL日志。