【发布时间】:2016-05-10 15:35:13
【问题描述】:
在我的 Action Bean 中,我从数据库加载实体,使用来自这些实体的数据使用 Java 8 ParallelStream 创建新的 EntityObject,并将这些 EntityObject 存储在 List 中以供以后在网页上使用。
我使用以下内容使用 Hibernate 映射实体创建这些对象:
List<Entity> entities = dao.getEntities();
List<Object> entityObjects = new ArrayList<>();
entityObjects.addAll(
entities.parallelStream()
.map(EntityObject::new)
.collect(Collectors.toList())
);
EntityObject 构造函数看起来像:
public EntityObject(Entity entity) {...}
当尝试使用 Action Bean 加载页面时,我得到了休眠异常。每次我尝试加载页面时它们都不同,但都与共享引用有关,例如:
... ERROR: Found shared references to a collection
和
... ERROR: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance
我做错了什么?
编辑:修正了代码。
【问题讨论】:
-
为什么要使用
entityObjects.addAll而不是直接使用流操作的结果,即List<Object> entityObjects = entities.stream().map(entityObjects::new) .collect(Collectors.toList());? -
@darksmurf 先听听Holger 说了什么,然后再看你的代码,那个map 部分是错误的,应该是map(EntityObject::new) 可能
-
@darksmurf 从您提供的日志来看,您的问题可能隐藏在 EntityObject 构造函数中,您能否也准确显示?
-
@Eugene 我对 map 部分的错误,更改了它。构造函数很复杂,可能是问题所在,但在我的情况下不是。我已经在下面回答了我的问题,这个线程的目的是告诉人们将 ParallelStream 与 Hibernate 一起使用可能是一个坏主意。如果我做错了,请告诉我:这是我的第一个问答线程。
-
@darksmurf 的想法是,这可能不是因为 parallelStream 本身,它可能在构造函数中做一些有趣的事情并且作为副作用,因为涉及并行可能会破坏你的代码.您应该首先清楚地了解异常。欢迎来到 SO btw ;)
标签: java hibernate java-8 java-stream stripes