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