这在某种程度上是Hibernate session thread safety的延续。所有的细节也适用于这里。简单地说,执行遵循以下模式:
1. Read entity
2. Do expensive, easily parallelizable work
3. Persist changes所有实体都配置为急切加载,并且会话在2期间根本不被访问。
2所涉及的工作不需要对持久集合进行频繁的修改。这就是我现在拥有的:
synchronized (parentEntity) {
parentEntity.getChildEntities().add(childEntity);
}这是很好的工作,但我试图“白痴-防止”这个系统,我正在寻找一种方法,以移动到持久层尽可能远的并发控制。我在刀上试过这个:
@Transactional
public ParentEntity getParentEntityById(long id) {
ParentEntity parent = ...;
parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
return parent;
}这导致了org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance...
有没有人可以将线程安全引入hibernate集合,或者以不需要污染业务逻辑的方式控制并发访问和修改?
Update- -按照佩斯的建议,这里是我最后做的事情:
@Transactional
public ParentEntity getParentEntityById(long id) {
ParentEntity parent = ...;
currentSession().evict(parent);
parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
return parent;
}工作完成后,我保存所有的孩子并调用currentSession().merge(parent)。就像一种魅力!
发布于 2013-11-26 02:54:14
如果第三步花费大量时间,那么我建议简单地:
当分离/未附加时,您应该能够将集合包装在线程安全集合中。合并不应该关心您拥有的集合实现。不过,我还没有测试过它。
https://stackoverflow.com/questions/20204897
复制相似问题