我有一个Hibernate项目,其实体与以下内容具有相似的关系:
Car {
String name;
Engine engine;
}
Engine {
String name;
}
我们有一个外部系统(Web服务,黑匣子)需要使用对上述实体所做的更改进行更新,但是,外部系统不区分Car
和{{ 1}}:
Engine
同步过程涉及从远程系统获取RemoteCar {
String name;
String engineName;
}
的实例,更新已从RemoteCar
和Car
更改的值,然后发送更新请求。
我正在尝试使用Engine
PostUpdateEventListener
返回requiresPostCommitHanding
来启动应用程序事件来更新外部系统,但是如果两个true
的名称都是并且Car
的名称在同一个事务中更新,我收到两个事件,与外部系统启动两个同步。
有没有办法确保我只收到我需要的活动?遗憾的是Engine
的一些更新是直接执行的(Engine
),这意味着EngineDao.get(1).setName()
永远不会涉及 - 我可以轻松地回到树上来获取Car
实例,但我不知道如何判断Car
的更新是否是Engine
的更新更新或Car
的自包含更新的一部分。
答案 0 :(得分:1)
我建议不要在每个侦听器回调中与远程系统同步,因为对于您提到的情况,它会成为潜在的I / O瓶颈。相反,我建议维护一个特定于事务的缓存并复制一次。
当PostUpdateEventListener
触发时,执行以下操作:
RemoteCar
。如果有,只需相应地更新缓存。如果它不在缓存中,则从远程系统获取它并更新缓存实例。在事务的提交阶段,将触发提交前事务回调,它将迭代缓存的实例,并根据您的API,可以向远程系统发送批量更新(1 I / O调用)以更新所有已修改的RemoteCar
个实例。
这将允许您的用例,其中2个更新触发2个同步点被简化为单个远程提取,2个本地更新和1个复制更新回到外部系统。