Event sourcing 轴突与弹簧&x27;s存储库集成

Event sourcing 轴突与弹簧&x27;s存储库集成,event-sourcing,axon,Event Sourcing,Axon,我已经阅读了Axon文档,并查看了所有提供的示例项目,特别是我在这里引用的项目,但有一件事仍然困扰着我,据我所知,没有解释: 据我所知,在Axon中,您对表示物化视图的读取数据库执行查询,例如,包含最新BankAccountJPA实体()的H2。但是,如果您有一个Spring存储库,例如JpaRepository(),那么您也有save-方法,该方法应该只用于命令。您不应该将存储库拆分为只读存储库和只读存储库吗 有人能告诉我Axon如何使用这个存储库的文档吗?因为对于一个联合开发人员来说,它看起

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

据我所知,在Axon中,您对表示物化视图的读取数据库执行查询,例如,包含最新
BankAccount
JPA实体()的H2。但是,如果您有一个Spring存储库,例如
JpaRepository
(),那么您也有
save
-方法,该方法应该只用于命令。您不应该将存储库拆分为只读存储库和只读存储库吗

有人能告诉我Axon如何使用这个存储库的文档吗?因为对于一个联合开发人员来说,它看起来像一个“普通”的JPA存储库,即实体看起来是可变的,并且总是最新的

但从理论角度来看,我期望一个不可变的实体处于零状态,通过应用所有事件创建投影,这会发生在有轴突的背景中吗

如果我用
JpaRepository#save
而不是聚合来更新实体,会发生什么?它们会不同步吗


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

让我来帮你吧

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

看着AxonBank,它应该清晰可见

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

如果我用
JpaRepository#save
而不是聚合来更新实体,会发生什么?它们会不同步吗

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

在这个案例中,我们似乎有两个真实的来源,这在理论上是不应该的

关于你关于真相来源的问题,你的事件应该永远是真相的来源。最后,除了使用
@EventHandler
s之外,您不应该更新存储库