JPA - @Version - 读取增加

时间:2012-06-17 18:19:58

标签: jpa optimistic-locking optimistic-concurrency

我已经使用@version注释实现了一个简单的实体ejb。我希望每次更新实体后版本号都会增加。

@Version
public Integer getVersion() {
    return version;
}
public void setVersion(Integer version) {
    this.version = version;
}

但这似乎没有像预期的那样奏效。 此外,每当我读取实体时,版本号会自动增加(!?)。我希望版本只会在提交后增加?

有人可以解释为什么我的版本在读取时也会增加吗?

1 个答案:

答案 0 :(得分:4)

最后我发现了这种奇怪行为的原因。 在我将所有值从我的(仍然附加的)实体复制到分离的域模型对象的方法中会出现问题。这一切都运行良好,因为我读了一个附加实体,包含一个复杂的数据结构(一个包含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);