何时明确排除乐观锁定(休眠)?
Posted
技术标签:
【中文标题】何时明确排除乐观锁定(休眠)?【英文标题】:When to explicitly exclude Optimistic Locking (Hibernate)? 【发布时间】:2011-09-14 22:19:14 【问题描述】:在什么情况下,通过 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】:基本上,当父级在逻辑上“拥有”其子级时,您需要对一对多关系进行乐观锁定,换句话说,当父级和子级作为一个整体同时修改时。由OrderLine
s 组成的Order
,以相同的形式呈现给用户,就是这种关系的一个例子。
否则,当孩子应该被单独修改时,他们应该被排除在乐观锁定之外。 Topic
和 Post
s 就是这种情况的一个例子。
从技术上讲,这个问题与关系的方向性有关。乐观锁定的目的是防止丢失修改,因此当可能丢失修改时,您需要为一对多关系启用它。当父级是关系的拥有方时会发生这种情况,换句话说,当一对多关系是单向的时(请注意,建模关系是自然的选择,例如Order
-OrderLine
)。
在双向一对多关系的情况下,“多”方是关系的拥有方,因此“一”方的关系修改不会影响数据库,因此它们不能迷路了。
【讨论】:
以上是关于何时明确排除乐观锁定(休眠)?的主要内容,如果未能解决你的问题,请参考以下文章