我们正在使用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()似乎是浪费资源。
答案 0 :(得分:1)
阿尔乔姆,
虽然我明白你以前给过的答案(包括我的答案)可能不是你所希望的,但它们不会改变:
refresh()
方法的地方做这件事,肯定是所有邪恶中较少的。