0

我正在使用 JPA/Hibernate 编写一个应用程序(一个 CMS),并且在一个 UI 中我有多个可能显示相同实体的组件(每个组件只显示一部分)。我也有多个用户界面,在多个用户的多个会话中。

其中一些组件也可以编辑实体,而所有其他组件应始终显示最新的实体。一个粗略的方法是定期刷新,但这很慢而且很重,所以我想出了一个 jpa 的同步机制。

使用拦截器(休眠的,因为 jpa 是哑的)我可以监听所有事务,所有新/更新/删除的实体并向感兴趣的每个组件发送通知。我还可以捕获派生事务,这意味着如果组件,响应通知,以任何方式修改实体(打开新事务)我可以重新发送通知(仅增量)。这是因为一个组件可能以这样一种方式修改实体,另一个组件可能需要再次修改它。(只是一个愚蠢的例子:一个组件设置出生日期,另一个重新计算年龄)

附言。 通知仅在事务提交后发送。这主要是因为

JPA 规范的第 3.5 节指出:“一般来说,可移植应用程序的生命周期方法不应调用 EntityManager 或 Query 操作、访问其他实体实例或修改同一持久性上下文中的关系。生命周期回调方法可能会修改调用它的实体的非关系状态。”</p>

因此,如果在事务内部通知,侦听器将毫无用处。并且(笑着忍受)将修改后的实体分组并一起通知它们。

这种通知机制越来越复杂,我想知道:

为什么jpa没有这样的机制?我在发明一些奇怪的东西?“真实应用”如何解决这个问题?

4

0 回答 0