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

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>();
1个回答

13

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

否则,当子项应该单独修改时,它们应该被排除在乐观锁定之外。PostTopic可以是这种情况的例子。

从技术角度讲,这个问题涉及到关系的方向性。乐观锁的目的是防止丢失的修改,因此当可能存在丢失的修改时,您需要启用它来处理一对多关系。如果父母是关系的“拥有方”,也就是说,当一对多关系是单向的时(请注意,将关系建模为如Order-OrderLine之类的关系是很自然的选择)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接