作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是 Hibernate session thread safety 的延续.所有细节也适用于此。简而言之,执行遵循以下模式:
1. Read entity
2. Do expensive, easily parallelizable work
3. Persist changes
实体都配置为eager loading,2期间根本不访问session。
2
中涉及的工作需要不经常修改持久集合。这就是我现在拥有的:
synchronized (parentEntity) {
parentEntity.getChildEntities().add(childEntity);
}
这工作得很好,但我正试图“防白痴”这个系统,我正在寻找一种方法将并发控制尽可能地向下移动到持久层。我在 dao 中试过这个:
@Transactional
public ParentEntity getParentEntityById(long id) {
ParentEntity parent = ...;
parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
return parent;
}
这导致 org.hibernate.HibernateException:具有 cascade="all-delete-orphan"的集合不再被拥有实体实例引用...
有没有人有办法为 hibernate 集合引入线程安全,或者有其他干净的方法以不需要污染业务逻辑的方式来控制并发访问和修改?
更新- 根据 Pace 的建议,这是我最终做的事情:
@Transactional
public ParentEntity getParentEntityById(long id) {
ParentEntity parent = ...;
currentSession().evict(parent);
parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
return parent;
}
工作完成后,我保存所有子项并调用 currentSession().merge(parent)
。就像一个魅力!
最佳答案
如果第 3 步需要花费大量时间,那么我会简单地建议:
当分离/未附加时,您应该能够将集合包装在线程安全集合中。合并不应该关心你有什么集合实现。不过我还没有测试过。
关于java - Hibernate 线程安全集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204897/
我是一名优秀的程序员,十分优秀!