4

我们刚刚对我们的 Web 应用程序进行了大规模升级 - 从 jboss 4 跳转到 jboss 7。我们也从 hibernate 3 迁移到了 hibernate 4。

我遇到了这种奇怪的行为(在休眠 3 下没有发生): 1. 我运行一个 hql(假设 hql 过滤状态字段 - status = 1)并取回一个对象。2. 我将其状态更改为 2。 3. 我再次运行 hql 并获得相同的对象(它甚至是相同的实例 - 状态已更改!) - 不再符合条件!

我发现问题是在查询之前会话没有自动刷新,这很奇怪,因为会话有flushmode.auto。

有人可以帮忙吗?

4

2 回答 2

3

您可以尝试将刷新模式显式设置为适当的值,其他模式可用。

session.setFlushMode(FlushMode.ALWAYS); 

也可以手动冲洗session.flush()

从文档:

  • ALWAYS :在每次查询之前刷新会话。

  • AUTO :有时会在查询执行之前刷新会话,以确保查询永远不会返回过时状态。

(我强调)


编辑:我还没有尝试在应用程序级别应用它,但您可以在 persistence.xml 中指定它

<property name="org.hibernate.FlushMode" value="always" />

在 hibernate.cfg.xml 中作为

<property name="hibernate.flushMode">ALWAYS</property>
于 2013-01-09T08:10:17.577 回答
3

我发现了问题,它是事务工厂类(属性名称 - hibernate.transaction.factory_class)。它基本上归结为这样一个事实,即在配置了 JtaTransactionFactory 的 JTA 场景中,hibernate 不会检测到它在事务中,因此不会执行中间刷新。将其更改为 org.hibernate.transaction.CMTTransactionFactory 时,一切正常。

于 2013-03-13T14:02:04.790 回答