2009-09-09 30 views
3

我有2個實體:ParentChild以一對多的關係。 Parent是版本化的,即具有@Version字段。我的目標是在Parent的版本上同步對ParentChild實體的更改。Hibernate的@Version能否考慮相關實體的變化?

E.g.一個線程更新Parent,另一個線程更新其中一個Child s,這應該會導致OptimisticLockException。

可能嗎?

我試着向Child添加一個@PreUpdate,它會增加它的Parent版本,但這並沒有幫助,因爲Hibernate似乎在它檢查版本後才執行偵聽器,因此事務成功提交。

如果可能,如何實現?

回答

1

您是否嘗試製作兒童組件而不是實體

默認的Hibernate操作可能更符合您的要求。這個想法是,父母是一個真正的實體,而孩子被認爲是一個更大整體的元素。

在Hibernate中,這應該被認爲是默認的父子關係。 實體之間的父子關係雖然不太自然,儘管可能。

+0

我認爲這不適合我。孩子是一個具有身份和身份的一流實體,應該保持這種狀態。雖然你的想法絕對是一種解決方案,但它不適用於我 – artemb 2009-09-09 14:16:49

+0

好的,我明白了。 。 。您的需求可能與休眠,但我不記得你應該嘗試...對不起。 – KLE 2009-09-09 15:15:04

1

首先,這裏有兩個問題需要澄清:

  1. 我想你正試圖趕上一個特定的子實例所做的更新,而不是收集修改(例如,新的兒童被添加/舊的刪除)。後者會默認增加父版本。

  2. 當你說「一個線程更新父」和「另一個更新子」我假設立即刷新更改。換句話說,事件的順序是:父母被更新並且持續(變更被刷新;交易承諾);另一個線程嘗試更新指向父版以前版本的子節點並失敗。如果情況並非如此,樂觀鎖定不會幫助你。

您可能能夠解決通過設置適當的隔離級別位「提交的事務」,但是這可能會導致更多的問題,那麼它在併發環境中解決。您無法解決「即時沖洗」需求。

假設上述假設是正確的,在更新您的子實例之前,您需要使用EntityManager.lock()方法鎖定。有關詳細信息,請參閱LockModeTypeHibernate EntityManager docs

相關問題