在 Hibernate 事务中更新多个对象后启动事件
Kicking off an event after multiple objects updated in Hibernate transaction
我有一个 Hibernate 项目,其中的实体具有与以下类似的关系:
Car {
String name;
Engine engine;
}
Engine {
String name;
}
我们有一个外部系统(网络服务,一个黑匣子)需要根据对上述实体所做的更改进行更新,但是,外部系统不区分 Car
和Engine
:
RemoteCar {
String name;
String engineName;
}
同步过程涉及从远程系统获取 RemoteCar
的实例,更新从 Car
和 Engine
更改的值,然后发送更新请求。
我正在尝试使用 PostUpdateEventListener
和 requiresPostCommitHanding
返回 true
来启动应用程序事件以更新外部系统,但是如果 Car
' s 的名称和 Engine
的名称在同一个事务中更新,我收到两个事件,开始与外部系统进行两次同步。
有没有办法确保我只收到我需要的事件?遗憾的是,对 Engine
的一些更新是直接执行的 (EngineDao.get(1).setName()
),这意味着 Car
从未涉及 - 我可以轻松地回到树上获取我的 Car
例如,但我不知道如何判断 Engine
的更新是 Car
的较大更新的一部分还是 Engine
.
的独立更新的一部分
我建议不要在每个侦听器回调上与远程系统同步,因为对于您提到的情况,它会成为潜在的 I/O 瓶颈。相反,我建议维护一个特定于事务的缓存并复制一次。
当 PostUpdateEventListener
触发时,执行如下操作:
- 检查当前事务是否有缓存。如果没有,创建缓存并注册提交前事务回调(更多内容见下文)。
- 对于每个更新事件,检查缓存以查看是否已获取适当的
RemoteCar
。如果有,只需相应地更新缓存。如果它不在缓存中,从远程系统获取它并更新缓存实例。
在事务的提交阶段,触发提交前事务回调,这将迭代缓存的实例,并且根据您的 API,可以发送批量更新(1 I/O 调用)到您的远程系统以更新所有已修改的 RemoteCar
个实例。
这将允许将 2 个更新触发 2 个同步点的用例减少为单个远程提取、2 个本地更新和 1 个返回外部系统的复制更新。
我有一个 Hibernate 项目,其中的实体具有与以下类似的关系:
Car {
String name;
Engine engine;
}
Engine {
String name;
}
我们有一个外部系统(网络服务,一个黑匣子)需要根据对上述实体所做的更改进行更新,但是,外部系统不区分 Car
和Engine
:
RemoteCar {
String name;
String engineName;
}
同步过程涉及从远程系统获取 RemoteCar
的实例,更新从 Car
和 Engine
更改的值,然后发送更新请求。
我正在尝试使用 PostUpdateEventListener
和 requiresPostCommitHanding
返回 true
来启动应用程序事件以更新外部系统,但是如果 Car
' s 的名称和 Engine
的名称在同一个事务中更新,我收到两个事件,开始与外部系统进行两次同步。
有没有办法确保我只收到我需要的事件?遗憾的是,对 Engine
的一些更新是直接执行的 (EngineDao.get(1).setName()
),这意味着 Car
从未涉及 - 我可以轻松地回到树上获取我的 Car
例如,但我不知道如何判断 Engine
的更新是 Car
的较大更新的一部分还是 Engine
.
我建议不要在每个侦听器回调上与远程系统同步,因为对于您提到的情况,它会成为潜在的 I/O 瓶颈。相反,我建议维护一个特定于事务的缓存并复制一次。
当 PostUpdateEventListener
触发时,执行如下操作:
- 检查当前事务是否有缓存。如果没有,创建缓存并注册提交前事务回调(更多内容见下文)。
- 对于每个更新事件,检查缓存以查看是否已获取适当的
RemoteCar
。如果有,只需相应地更新缓存。如果它不在缓存中,从远程系统获取它并更新缓存实例。
在事务的提交阶段,触发提交前事务回调,这将迭代缓存的实例,并且根据您的 API,可以发送批量更新(1 I/O 调用)到您的远程系统以更新所有已修改的 RemoteCar
个实例。
这将允许将 2 个更新触发 2 个同步点的用例减少为单个远程提取、2 个本地更新和 1 个返回外部系统的复制更新。