我正在使用JPA / Hibernate编写应用程序(CMS),并且在单个UI中我有多个组件可能显示相同的实体(每个组件仅显示一部分)。我在多个用户的多个会话中也有多个UI。
其中一些组件也可以编辑实体,所有其他组件应始终显示最新实体。 一个粗略的方式是定期刷新,但这是滞后和沉重的,所以我想出了jpa的同步机制。
使用拦截器(hibernate,因为jpa是哑的)我可以监听所有事务,所有新的/更新/删除的实体并向每个感兴趣的组件发送通知。 我也可以捕获派生事务,这意味着如果组件响应通知,以任何方式修改实体(打开新事务),我可以重新发送通知(只有增量)。 这是因为组件可以以这样的方式修改实体,使得另一个组件可能需要再次修改它。 (只是一个愚蠢的例子:一个组件设置出生日期,另一个重新计算年龄)
ps。 仅在事务提交后调度通知。这主要是因为
JPA规范第3.5节规定: “通常,可移植应用程序的生命周期方法不应调用EntityManager或Query操作,访问其他实体实例或修改同一持久性上下文中的关系。生命周期回调方法可以修改调用它的实体的非关系状态。“
因此如果在事务内部通知,则侦听器将无用。 并且(笑着承担)将修改后的实体分组并一起通知所有实体。
这种通知机制越来越复杂,我想知道:
为什么jpa没有这样的机制? 我发明了一些奇怪的东西? “真正的应用程序”如何解决这个问题?