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重新加载。
对我来说,它可以提交当前事务,并在另一个应用程序应用其修改后开始一个新事务。