我们正在使用 Hibernate 运行 JBoss,并且遇到了这个问题。
当会话 bean 使用 EntityManager 查找实体时,它可能已经存在于 EntityManager 的缓存中,并且它的状态可能已经过时。如果代码使用这样的实体来做出决定,它可能会做出错误的决定,从而产生错误。
这是一个示例案例。
HTTP 请求 1. 会话 bean 创建一个实体实例并将其存储,并将字段“A”设置为值 1。持久化实体的 ID = 4。
HTTP 请求 2。会话 bean 查找 ID = 4 的实体,将其字段“A”设置为值 2 并保存它。
HTTP 请求 3。会话 bean 查找 ID = 4 的实体并检查它的字段“A”。如果值为 1 则做一件事,如果值为 2 则做另一件事。
如果请求 3 中的 EM 恰好与请求 1 中的 EM 相同,则会发生不希望的行为。我已经对此进行了测试并得到了大约。10%的失败案例。
所以问题是 - 如何避免这种情况?每次我必须确保实体是最新的时调用 em.refresh() 或 em.clear() 似乎是在浪费资源。