在 Hibernate 事务中更新多个对象后启动事件

Kicking off an event after multiple objects updated in Hibernate transaction

我有一个 Hibernate 项目,其中的实体具有与以下类似的关系:

Car {
    String name;
    Engine engine;
}

Engine {
    String name;
}

我们有一个外部系统(网络服务,一个黑匣子)需要根据对上述实体所做的更改进行更新,但是,外部系统不区分 CarEngine:

RemoteCar {
    String name;
    String engineName;
}

同步过程涉及从远程系统获取 RemoteCar 的实例,更新从 CarEngine 更改的值,然后发送更新请求。

我正在尝试使用 PostUpdateEventListenerrequiresPostCommitHanding 返回 true 来启动应用程序事件以更新外部系统,但是如果 Car' s 的名称和 Engine 的名称在同一个事务中更新,我收到两个事件,开始与外部系统进行两次同步。

有没有办法确保我只收到我需要的事件?遗憾的是,对 Engine 的一些更新是直接执行的 (EngineDao.get(1).setName()),这意味着 Car 从未涉及 - 我可以轻松地回到树上获取我的 Car例如,但我不知道如何判断 Engine 的更新是 Car 的较大更新的一部分还是 Engine.

的独立更新的一部分

我建议不要在每个侦听器回调上与远程系统同步,因为对于您提到的情况,它会成为潜在的 I/O 瓶颈。相反,我建议维护一个特定于事务的缓存并复制一次。

PostUpdateEventListener 触发时,执行如下操作:

  1. 检查当前事务是否有缓存。如果没有,创建缓存并注册提交前事务回调(更多内容见下文)。
  2. 对于每个更新事件,检查缓存以查看是否已获取适当的 RemoteCar。如果有,只需相应地更新缓存。如果它不在缓存中,从远程系统获取它并更新缓存实例。

在事务的提交阶段,触发提交前事务回调,这将迭代缓存的实例,并且根据您的 API,可以发送批量更新(1 I/O 调用)到您的远程系统以更新所有已修改的 RemoteCar 个实例。

这将允许将 2 个更新触发 2 个同步点的用例减少为单个远程提取、2 个本地更新和 1 个返回外部系统的复制更新。