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

时间:2016-09-29 10:48:25

标签: hibernate event-listener

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

Car {
    String name;
    Engine engine;
}

Engine {
    String name;
}

我们有一个外部系统(Web服务,黑匣子)需要使用对上述实体所做的更改进行更新,但是,外部系统不区分Car和{{ 1}}:

Engine

同步过程涉及从远程系统获取RemoteCar { String name; String engineName; } 的实例,更新已从RemoteCarCar更改的值,然后发送更新请求。

我正在尝试使用Engine PostUpdateEventListener返回requiresPostCommitHanding来启动应用程序事件来更新外部系统,但是如果两个true的名称都是并且Car的名称在同一个事务中更新,我收到两个事件,与外部系统启动两个同步。

有没有办法确保我只收到我需要的活动?遗憾的是Engine的一些更新是直接执行的(Engine),这意味着EngineDao.get(1).setName()永远不会涉及 - 我可以轻松地回到树上来获取Car实例,但我不知道如何判断Car的更新是否是Engine的更新更新或Car的自包含更新的一部分。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 检查当前事务是否具有缓存。如果没有,则创建缓存并在提交事务回调之前注册(更多信息如下)。
  2. 对于每个更新事件,请检查缓存以查看是否已获取相应的RemoteCar。如果有,只需相应地更新缓存。如果它不在缓存中,则从远程系统获取它并更新缓存实例。
  3. 在事务的提交阶段,将触发提交前事务回调,它将迭代缓存的实例,并根据您的API,可以向远程系统发送批量更新(1 I / O调用)以更新所有已修改的RemoteCar个实例。

    这将允许您的用例,其中2个更新触发2个同步点被简化为单个远程提取,2个本地更新和1个复制更新回到外部系统。