Java:Hibernate没有看到DataBase的变化

时间:2010-11-30 12:16:01

标签: java hibernate flush

我有两个不同的应用程序共享同一个数据库。问题是,当我有一个应用程序在数据库中更改某些内容时,另一个不会更新。

我试图制作一个session.flush(),但它没有用。唯一的方法是关闭整个会话并重新创建它,但当然,这需要太长时间。

4 个答案:

答案 0 :(得分:2)

简短回答:每次要显示某个对象时发出session.refresh(obj)。它将强制Hibernate转到数据库。另一种解决方案是使用StatelessSession,它不会缓存任何内容(甚至不是一级缓存),每次需要记录时都会强制应用程序进入数据库:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession

但是,当然,如果那太多了,那么你可以考虑使用某种锁定(悲观或乐观):

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html#transactions-optimistic

但实际上,如果你有两个不同的并发系统使用相同的记录,那么Hibernate本身就无法解决。您应该在系统架构中考虑这一点。

答案 1 :(得分:1)

如果我理解正确,这就是你的场景中发生的事情:

  • app1启动交易
  • app2(启动并)提交另一项交易
  • app1希望能够阅读app2所做的更改

如果是这种情况,您需要检查数据库Isolation levels

当您想要阅读更新的数据时,您当然可以开始新的交易。查看Hibernate transactions documentation

答案 2 :(得分:0)

我没有测试过这个,但是Session类有一个清除所有已加载实体的方法。这应该强制从db重新加载。

答案 3 :(得分:0)

对我来说,它可以提交当前事务,并在另一个应用程序应用其修改后开始一个新事务。