有没有办法通过Hibernate观察Database表中的变化?

时间:2009-11-12 13:19:54

标签: java database hibernate orm

在我的应用程序中,我在一个单独的类中存储一个包含50个记录的小表,因为该表中的数据几乎没有变化 - 例如国家名单。

虽然这个概念并不好,但我现在必须继续这样做。在Hibernate中是否有任何解决方案可以观察表中的变化和更改,调用类的方法来更新变量。

4 个答案:

答案 0 :(得分:7)

Hibernate不会收到有关表级更改的通知。 (坏)解决方案是通过Hibernate的API更新数据,并使用Interceptor提供的回调之一与Singleton进行一些黑魔法伏都教。但老实说,处理这个问题的(正确)方法是摆脱单例并将数据放入二级缓存(如果手动更新表,则使缓存无效)。

(编辑:正如ChssPly76在评论中提到的,如果删除单例不是一个选项,其中包括修改单例以查找和返回缓存的hibernate管理实体,例如您的国家/地区,则有一个中间解决方案。)

答案 1 :(得分:1)

实施Interceptor#onFlushDirty()啊不,你想从另一边做。不,这是不可能的。最好的方法是以一定的间隔重新加载数据,例如每小时一次。您可以使用java.util.TimerTask

那就是说Singleton真是个坏主意。只是将它作为主要上下文的某种属性。如果它是例如Java EE Web应用程序,则可以使用ServletContext

答案 2 :(得分:1)

您的情况听起来非常适合L2 cache,因为您的对象很少更改并因此设置您的驱逐政策以进行刷新。此外,如果通过Hibernate完成 ALL mod,那么您可以跟踪events/interceptor基础架构中发生的情况。当然,Hibernate不知道的任何辅助表都必须通过@BalusC建议的其他方式进行跟踪。

答案 3 :(得分:0)

对于数据库端而言,最简单的方法似乎是trigger而不是应用程序内部。但这当然取决于底层数据库,如果你真的想使用SQL,那么其他一切都是由Hibernate完成的。