8

在什么情况下通过 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>();
4

1 回答 1

13

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

否则,当孩子应该被单独修改时,他们应该被排除在乐观锁定之外。Topicwith Posts 就是这种情况的一个例子。

从技术上讲,这个问题与关系的方向性有关。乐观锁定的目的是防止丢失修改,因此当可能丢失修改时,您需要为一对多关系启用它。当 parent 是关系的拥有方时会发生这种情况,换句话说,当一对多关系是单向的时(请注意,对诸如Order-之类的关系建模是自然的选择OrderLine)。

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

于 2011-06-14T19:00:33.517 回答