2

我们将 Hibernate 3.1 与 Spring MVC 2.0 一起使用。当直接在数据库上更新数据(而不是在应用程序中)时,就会出现我们的问题。我们使用过滤器根据订单是否打开或关闭来过滤结果集合。如果我们将 DB 上的订单更改为关闭,过滤器会返回正确的列表,但是,对象的状态不会改变。

  • 我们没有启用二级缓存或查询缓存。
  • 从数据库中检索集合是通过 Hibernate 的 Session.createQuery。
  • 此外,我们连接了一个 SessionFactory,并在整个应用程序中使用一个 Session。

对象显示正确状态结果的唯一时间是服务器重新启动时——我们不希望定期这样做。

4

4 回答 4

5

Session 总是有一个“一级”缓存,所以如果你使用一个 Session,你通过它读取的所有内容都将被缓存。Hibernate 将对数据库执行查询,但是当它构建对象时,它会检查 Session 缓存以避免构建新对象,因此数据库中更改的任何列都不会被刷新。如果你关闭它并获得一个新的会话,它将在下一次查询时从数据库中读取完整的对象。

于 2008-10-07T19:40:25.917 回答
1

当您有进程“在其背后”时,您不能真正期望 Hibernate 正确管理其缓存对象的“脏”状态。如果您使用注释,我建议将状态(如果这是字段的名称)标记为@Transient,以便 Hibernate 知道它必须每次都从数据库中获取此值。

于 2008-10-07T18:02:03.197 回答
1

您可能想要启用缓存并设置到期时间。然后一旦缓存过期并且有人请求,Hibernate 将刷新数据库中的数据。

我在家庭项目中使用它,因为我偶尔会调整数据库。然后我稍等片刻,刷新页面并查看调整后的数据。

看看 Hibernate 中的 ehcache。

于 2008-10-07T18:10:22.837 回答
1

您可以使用版本控制Hibernate Version。您的外部进程必须增加版本号(或时间戳)以让 Hibernate 知道有新版本可用。

这不一定是立即更改,但比容器重启更频繁(在我们的例子中每隔几分钟)。

它有几个缺点:

  • 您的应用程序可能会使用旧数据运行一段时间
  • 如果版本通过批处理作业增加,并且休眠尝试保存更新的旧版本记录,您将生成异常
  • 共享数据库的扩展性较差;经常检查确实性价比。

我绝不是 Hibernate 专家,但这是可能的。

于 2008-10-07T18:22:05.370 回答