0

我想使用JPA持久化一個實體列表。我的第一種方法如下:錯誤持續使用java並行數據流的實體列表

List<myEntity>entityList=myService.getMyEntities();` 
\\some other activities...` 
entityList.parallelStream().forEach(l->l.setMyStatus(MyStatus.newStatus); 
entityList.parallelStream().forEach(l->myService.getEntityManager().merge(l)); 

但我得到了一個OptimisticLockException。

我的第二種方法是使用流而不是並行流。

entityList.stream().forEach(l->myService.getEntityManager().merge(l)); 

第二種方法可行!現在我的問題是爲什麼parallelStream()會導致樂觀鎖定異常?

+0

你的第二種方法仍然使用並行流。你的第一個包含編譯錯誤。 – Holger

+0

@Holger很抱歉這是一個輸入錯誤。我糾正了它 – Lakshi

回答

0

最直接的答案谷歌的「樂觀鎖定」產生,指着this question

樂觀鎖是你讀取記錄的策略,注意版本號的(其他的方法來做到這一點涉及日期,時間戳或校驗和/散列),並在寫回記錄之前檢查版本是否未更改。

如果您的列表包含兩次相同的條目,它可能會被並行讀取兩次,然後合併一次,並在第二次合併時引發異常。如果你沒有並行數據流,你就可以讀寫,並且沒有版本衝突。基本上,您必須在別人可以閱讀並再次更改之前回寫。

你是否檢查過列表中的實體是唯一的?

+0

是的!我檢查了。它們是獨特的。這就是爲什麼我想知道。我從數據表中獲得這些實體,每個實體都有唯一的ID。 – Lakshi

+0

這些實體是否共享鏈接的屬性?異常是否表明發生錯誤的地方? –

+0

是的。他們有關係型的一對一實體,但它們是獨一無二的。沒有交叉關係 – Lakshi