有关设置的一些事实:
- 这是一个基于 Tomcat 的应用(尽管问题也出现在 Tomcat 上下文之外 - JUNIT)
- 不使用 Spring
- 每个线程都有自己的 Hibernate
Session
(在 TLS 上) - 对象以混合方式保存/加载,即
ObjA
可能由线程A创建,然后由线程B操作,甚至稍后由线程A更新,然后再次由线程Z操作,但这次使用HQL!
进行上述设置后,我遇到了以下错误:
org.hibernate.HibernateException:非法尝试将代理与两个打开的 session 关联
org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存值映射不正确)
我的理解是
- 这一切都与 Hibernate 的
Session
有关,因为 session “拥有”“附加”到它的对象(它创建/加载的对象) - 并且可能存在缓存问题
问题很明显:
- 我理解核心问题(上文)吗?
- 如何避免此类问题?
- 是否有经验法则可以帮助避免这些问题?
- 使用 Spring 是否有助于解决这个问题(请具体说明一下)?
- 从数据存储区获取每个对象后将其与
Session
分离,然后在更新之前将其附加到Session
是否是处理该问题的理想方法?
如果我只使用一个 Session
对象,我当然可以避免所有这些,但这听起来很……阻塞(线程方面)。
我确信这类问题很久以前就已经解决了,只需要找到它(无需重新发明轮子)。
最佳答案
该对象已附加到 Hibernate session ,是的。是的,它一次只能连接到一个。除非您关闭 Hibernate session ,否则您可以尝试 evict()
该对象,从而将其与 session 分离,从而可以将其加载到另一个线程中。问题是,这可能不切实际,具体取决于您的程序流程。
关于java - hibernate多线程多 session 和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11237924/