关于设置的几个事实:
- 这是一个基于 Tomcat 的应用程序(尽管问题也出现在 Tomcat 的上下文之外 - JUNIT)
- 不使用弹簧
- 每个线程都有自己的 Hibernate
Session
(在 TLS 上) - 对象以混合方式保存/加载,即
ObjA
可以由线程 A 创建,然后由线程 B 操作,甚至稍后由线程 A 更新,再次由线程 Z 操作,但这次使用 HQL!
进行上述设置后,我遇到了错误,例如:
org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
我的理解是
- 这一切都与 Hibernate 相关
Session
,因为会话“拥有”“附加”到它的对象(它创建/加载的对象) - 并且可能是缓存问题
问题很明显:
- 我是否理解核心问题(上图)?
- 如何避免此类问题?
- 是否有经验法则可以帮助避免这些问题?
- 使用 Spring 会帮助解决它吗(请具体说明一下)?
- 在从数据存储中获取每个对象之后将其从每个对象中分离,并在更新之前
Session
将其附加到稍后将是处理它的理想方式吗?Session
如果我只使用一个Session
对象,我当然可以避免所有这些,但这听起来……阻塞(线程方面)。
我确信这些问题很久以前就已经解决了,只需要找到它(无需重新发明轮子)。