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.
关于你关于真相来源的问题,你的事件应该永远是真相的来源。最后,除了使用 @EventHandler
s.
之外,你不应该更新存储库
我已经阅读了 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.
关于你关于真相来源的问题,你的事件应该永远是真相的来源。最后,除了使用 @EventHandler
s.