Axon 和 Spring 的存储库集成

Axon and Spring's repository integration

我已经阅读了 Axon 文档并查看了所有提供的示例项目,尤其是我在这里引用的 AxonBank,但有一件事仍然困扰着我,据我所知没有解释:

据我了解,在 Axon 中,您对表示物化视图的读取数据库执行查询,例如一个包含最新 BankAccount JPA 实体 (here). However if you have a Spring repository, e.g. JpaRepository<BankAccount, Long> (here) 的 H2,您还有 save-方法,它应该只用于命令。难道不应该把仓库分成只读和只写的仓库吗?

有人可以向我指出 Axon 如何与此存储库一起工作的文档吗?因为对于统一的开发人员来说,它看起来像一个 "normal" JPA 存储库,即实体似乎是可变的并且始终是最新的。

但是从理论的角度来看,我期望一个处于零状态的不可变实体,其中通过应用所有事件创建投影,这是否发生在 Axon 的后台?

如果我用 JpaRepository#save 更新实体而不是聚合会怎样?它们会不同步吗?

在这种情况下,我们似乎有两个事实来源,理论上不应该是这样。

我来帮你吧!

您所描述的是 CQRS pattern - 特别是查询端! 您提到的存储库通常在 @EventHandler 上用于构建您的投影,它将按照您需要的方式存储数据!

看AxonBank,应该清晰可见here

我认为 Axon 文档中没有任何关于它的具体内容,但实际上这是一个常规的 JPA 存储库。当然你可以使用任何你想要的作为你的查询端。

What would happen if I update the entity with JpaRepository#save but not the aggregate? Will they be out of sync?

在这种情况下,您的视图模型将根据事件以外的任何内容进行更新,这不是您想要的。此存储库应仅根据事件进行更新,大多数情况下,这些事件是由您的聚合发送的!

It seems that we have two sources of truth in this case, which shouldn't be the case theoretically.

关于你关于真相来源的问题,你的事件应该永远是真相的来源。最后,除了使用 @EventHandlers.

之外,你不应该更新存储库