我正在使用带有Hibernate 3.x的JPA 2。我有两个实体对象Foo和Bar,关系就像这样 -
@Entity
public class Foo{
@Id
private long id;
@OneToOne(cascade = CascadeType.ALL )
@JoinColumn(name = "bar")
private Bar bar;
@Version
private int version;
}
@Entity
public class Bar{
@Id
private long id;
private String name;
@Version
private int version;
}
现在我的问题是如果我从Foo
加载了entityManager.find(...)
并更新name
Bar
foo.getBar().setName("someAnotherName");
并entityManager.merge(foo)
并点击Bar
,那么Hibernate会触发Bar
上的更新,仅增加version
的版本。从对象的角度来看,它也不会改变Foo的状态,也不应该增加Foo的版本吗?
现在,我想从Bar
中移除version
属性,Foo
的{{1}}如果Bar
更新,则会增加{{1}}。
我怎样才能做到这一点?
答案 0 :(得分:3)
在您的情况下,不是Foo,但它引用的实体已经更改,因此不需要版本增量。
@Version为实体添加乐观锁定功能,不应将其用作更改计数器。此注释的主要目的是检测冲突的更新,因此在执行此操作之前请三思。
重写此行为的唯一方法是使用[OPTIMISTIC | PESSIMISTIC] _FORCE_INCREMENT