我们正在使用Hibernate 3.1和Spring MVC 2.0。当数据直接在数据库上更新(而不是在应用程序中)时,会出现问题。我们使用过滤器根据订单是打开还是关闭来过滤结果集合。如果我们更改要关闭的DB上的订单,过滤器将返回正确的列表,但是,对象的状态不会更改。
对象显示正确状态结果的唯一时间是服务器重新启动时 - 我们不希望定期执行此操作。
答案 0 :(得分:3)
Session始终具有“第一级”缓存,因此如果您使用一个Session,那么您通过它读取的所有内容都将被缓存。 Hibernate将对数据库执行查询,但是当它构建对象时,它会检查Session缓存以避免构建新对象,因此数据库中更改的任何列都不会刷新。如果你关闭它并获得一个新的Session,它将在下一个查询中从数据库中读取完整的对象。
答案 1 :(得分:1)
当你有进程“背后”时,你真的不能指望Hibernate正确地管理其缓存对象的“脏”状态。如果您正在使用注释,我建议将状态(如果该字段的名称)标记为@Transient,以便Hibernate知道每次都必须从数据库中获取此值。
答案 2 :(得分:1)
您可能希望启用缓存并设置到期时间。 然后,一旦缓存过期并且有人请求,Hibernate将刷新数据库中的数据。
我在家庭项目中使用它,因为我偶尔会调整数据库。然后我等一会儿,刷新页面,看看我调整的数据。
看看Hibernate中的ehcache。
答案 3 :(得分:1)
您可以使用版本控制Hibernate Version。您的外部进程必须增加版本号(或时间戳)才能让Hibernate知道新版本可用。
这不一定是立即改变,但比容器重启更频繁(在我们的案例中每隔几分钟)。
它有一些缺点:
我绝不是Hibernate专家,但它是可能的。