1

关于设置的几个事实:

  • 这是一个基于 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对象,我当然可以避免所有这些,但这听起来……阻塞(线程方面)。

我确信这些问题很久以前就已经解决了,只需要找到它(无需重新发明轮子)。

4

2 回答 2

1

该对象附加到 Hibernate 会话,是的。它一次只能附加一个,是的。除非您关闭 Hibernate 会话,否则您可以尝试访问evict()该对象,从而将其与会话分离,从而可以将其加载到另一个线程中。问题是,这可能不切实际,具体取决于您的程序流程。

于 2012-06-28T06:19:52.857 回答
0

clear()在获取对象之前调用。

于 2012-08-16T18:55:44.457 回答