Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法通过Hibernate观察数据库表中的更改?_Java_Database_Hibernate_Orm - Fatal编程技术网

Java 有没有办法通过Hibernate观察数据库表中的更改?

Java 有没有办法通过Hibernate观察数据库表中的更改?,java,database,hibernate,orm,Java,Database,Hibernate,Orm,在我的应用程序中,我在一个单例类中存储了一个包含50条记录的小表,因为该表中的数据几乎没有变化,例如国家列表 虽然这个概念不好,但我现在必须继续。Hibernate中是否有任何解决方案可以观察表中的更改,并在更改时调用类的方法来更新变量。实现。啊,不,你想从另一边开始。不,不可能。您所能做的最好的事情是以一定的间隔重新加载数据,例如每小时一次。你可以用这个 也就是说,Singleton确实是个坏主意。把它作为主上下文的某种属性。例如,如果它是一个Java EE Web应用程序,您可以使用Serv

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

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

实现。啊,不,你想从另一边开始。不,不可能。您所能做的最好的事情是以一定的间隔重新加载数据,例如每小时一次。你可以用这个


也就是说,
Singleton
确实是个坏主意。把它作为主上下文的某种属性。例如,如果它是一个Java EE Web应用程序,您可以使用
ServletContext

Hibernate不会收到在表级别所做更改的通知。(糟糕的)解决方案是通过Hibernate的API更新数据,并使用一个由提供的回调函数对Singleton进行一些黑魔法巫毒。但老实说,(正确的)处理方法是摆脱单例,将数据放入二级缓存(如果手动更新表,则使缓存失效)


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

最简单的解决方法似乎是在数据库端而不是在应用程序内部安装。但这当然取决于基础数据库,以及如果其他所有操作都由Hibernate完成,您是否真的想使用SQL。

您的情况听起来非常适合,因为您的对象很少更改,并相应地将您的驱逐策略设置为刷新。此外,如果所有的mod都是通过Hibernate完成的,那么您可以跟踪通过基础设施发生的事情。当然,Hibernate不知道的任何辅助表都必须通过@BalusC建议的其他方式进行跟踪。

触发器无助于对单例调用方法。我不知道你在想什么。触发器可以调用应用程序来重新加载singleton。i、 e.将消息放在应用程序使用的队列上,CORBA调用应用程序,REST调用等+1用于二级缓存。OP甚至不需要摆脱单例,如果它绑定到代码中;重构它以从缓存中获取内容应该足够简单;没有必要弄乱过期或拦截器-这一切都会自动神奇地发生。对于辅助表(如果有),唯一可靠的方法是具有预定义的入口点并手动通知所有可能的更改;基本上是相同的二级缓存,但(如果需要)是分布式的。@ChssPly76在Hibernate问题上的赞誉——让我在这里度过了美好的一天:)每个人都在重复关于单例是邪恶的口号,但这主要适用于老式的(私有构造函数+getInstance方法)单例实现,它们的主要缺点是难以进行单元测试,并且在多线程或集群环境中不健壮。然而,Spring在其上下文中为“singleton”bean提供了一种完全有效的可能性。仅仅因为某些(非常主流且难以根除的)实现存在问题并不意味着单例模式总是不好的。