最后我找到了奇怪行为的原因。问题发生在我将所有值从我的(仍然连接的)实体复制到分离的域模型对象的方法中。这一切都很好,因为我读取了一个包含复杂数据结构的附加实体(一个包含 HashMaps 的向量)。我使用 List 接口中的 .addAll 方法复制了这些值:
List activePropertyValue = (List)mapEntry.getValue();
// value contains HashMaps!
List detachePropertyValue = new Vector();
detachePropertyValue.addAll(activePropertyValue);
但似乎这改变了附加实体数据属性的哈希值。所以在数据库中更新了所有实体之后,版本号增加了。
我通过在复制所有值之前分离实体解决了这个问题:
manager.detach(aEntity);
.....
List activePropertyValue = (List)mapEntry.getValue();
// value contains HashMaps!
List detachePropertyValue = new Vector();
detachePropertyValue.addAll(activePropertyValue);