3

我有 2 个实体:Parent并且Child是一对多的关系。这Parent是版本化的,即有一个@Version 字段。我的目标是同步对's 版本上的实体ParentChild实体的更改。Parent

例如,一个线程更新了一个线程Parent,另一个线程更新了其中一个线程Child,这应该会导致 OptimisticLockException。

可能吗?

我尝试添加一个 @PreUpdate 来Child增加它的版本Parent,但这并没有帮助,因为 Hibernate 似乎只有在它检查版本之后才执行侦听器,因此无论如何事务都会成功提交。

如果可能,如何实施?

4

2 回答 2

1

您是否尝试使 Child 成为组件而不是实体

默认的 Hibernate 操作可能更符合您的要求。这个想法是父母是一个真实的实体,而孩子被认为是一个更大的整体的一个元素。

在 Hibernate 中,这应该被视为默认的父子关系。尽管可能,实体之间的父子关系不太自然。

于 2009-09-09T13:34:15.230 回答
1

首先,这里有两个问题需要澄清:

  1. 我认为您正在尝试捕获对特定子实例所做的更新,而不是集合修改(例如,添加新子/删除旧子)。默认情况下,后者将增加父母的版本。

  2. 当您说“一个线程更新父级”和“另一个更新子级”时,我假设更改会立即刷新。换句话说,事件的顺序是: parent 被更新并持久化(更改已刷新;事务已提交1);另一个线程尝试更新指向先前版本的父级并失败的子级。如果不是这种情况,乐观锁定不会对您有所帮助。

1您可以通过设置适当的隔离级别来解决“事务提交”位,但这可能会导致更多问题,然后在并发环境中解决。您无法解决“立即刷新”要求。

假设上述假设是正确的,您需要在更新 Child 实例之前使用EntityManager.lock()方法来锁定Parent 。有关详细信息,请参阅LockModeTypeHibernate EntityManager 文档

于 2009-09-11T00:30:45.447 回答