Java:Hibernate没有看到DataBase的变化

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

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

简答:每次要显示某个对象时发出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本身就无法解决。 您应该在系统架构中考虑这一点。

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

  • app1启动一个事务
  • app2(启动和)提交另一个事务
  • app1希望能够读取app2所做的更改

如果是这种情况,您需要检查数据库隔离级别 。

或者,当您想要读取更新的数据时,您当然可以开始新的事务。 查看Hibernate事务文档

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

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