Hibernate查询自动刷新

时间:2013-01-09 07:54:44

标签: hibernate

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

我遇到过这种奇怪的行为(在hibernate 3下没有发生): 1.我运行一个hql(假设hql过滤状态字段 - status = 1)并返回一个对象。 2.我将其状态更改为2。 3.我再次运行hql并获得相同的对象(即使是相同的实例 - 状态已更改!) - 这与标准不再匹配!

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

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

session.setFlushMode(FlushMode.ALWAYS); 

此外,可以手动刷新session.flush()

来自文档:

  
      
  • 始终:每次查询前都会刷新会话。

  •   
  • 自动:在查询执行之前,会话 有时 已刷新,以确保查询永远不会返回失效状态。

  •   

(强调我的意思)


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

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

在hibernate.cfg.xml中作为

<property name="hibernate.flushMode">ALWAYS</property>

答案 1 :(得分:3)

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