何时明确排除乐观锁定(Hibernate)?

时间:2011-06-14 18:00:13

标签: hibernate optimistic-locking

在什么情况下通过Hibernate明确地从@OneToMany关系中排除乐观锁定?

我一直在阅读关于Hibernate的帖子,它基本上表示对子实体的任何更新都会导致对父实体的乐观锁定,这通常是不需要的。这里的关键词是通常是 ......任何人都可以更精确地解释你何时或不需要对这样的关系进行乐观锁定?

以下是用于演示乐观锁定排除的代码示例:

// Bars - these are specifically excluded from optimist lock
// for the object, since we don't want to obtain optimistic
// lock when we add a new bar
@OptimisticLock(excluded = true)
@OneToMany
@JoinColumn(name = "FOO_ID", nullable = false, updatable = false)
private List<FooBar> bars = new LinkedList<FooBar>();

1 个答案:

答案 0 :(得分:10)

基本上,当父级逻辑上“拥有”其子级时,您需要乐观锁定一对多关系,换句话说,当父级和子级作为一个整体被修改时。由Order组成的OrderLine以相同的形式呈现给用户,可以作为此类关系的一个示例。

否则,当应单独修改子项时,应将其排除在乐观锁定之外。带有Topic的{​​{1}}可以是此案例。

从技术上讲,这个问题与关系的方向性有关。乐观锁定的目的是防止丢失修改,因此当需要丢失修改时,您需要为一对多关系启用它。当父亲是关系的拥有方时,就会发生这种情况,换句话说,当一对多关系是单向的时(请注意,对于Post - {Order之间的关系进行建模是一种自然的选择。 {1}})。

在双向一对多关系的情况下,“多”侧是关系的拥有方,因此“一”侧关系的修改不会影响数据库,因此它们不能迷路了。