我正在开发一个有时在JPA管理实体上调用setter的应用程序。为什么即使值没有改变,JPA也会将这些对象标记为脏?
例如,我有一个对象,它有一个子对象。我可以调用entity.setMyChild(entity.getMyChild())
,JPA显然仍然将实体视为脏,并将更新它。
答案 0 :(得分:3)
你需要与编写规范(和实现)的人交谈以获得明确的答案,但我可以想到几个合理的理由。
如何确定旧值和新值没有变化?
您可以调用equals(Object)
(对象类型)!但它是"声音"为此使用equals
?那些不能为平等做出贡献的领域仍然需要坚持下去?
您可以使用对象标识。但是,如果应用程序创建"等于" willy-nilly?
简而言之,很难找到合适的定义"改变价值"。
费用怎么样?对于"仅在更改时设置为脏"要工作,您需要比较每个set
电话的新旧值。假设我们使用了equals(Object)
。考虑set
调用可以多次调用,equals(Object)
调用可能很昂贵,我们可能会遇到严重的性能问题。
我怀疑他们会考虑这种事情,并认为更简单的设置意味着脏"模型会更容易使用。
无论如何,如果您不喜欢JPA在这种情况下的工作方式,您可以随时在持久对象的API中添加另一个setter方法,该方法仅在新值时调用JPA setter是不同......根据某种模式。
答案 1 :(得分:0)
如果没有任何更改,EclipseLink不会执行更新。什么是生成的更新SQL?您是否更改了子对象的ID,或者您是否拥有该对象的两个副本?
请包含所有代码和SQL日志。