领域驱动设计与关系型数据库
所有的 Spring Data 模块都受到了领域驱动设计(Domain Driven Design)中“仓库(repository)”、“聚合(aggregate)”和“聚合根(aggregate root)”这些概念的启发。这些概念对于 Spring Data JDBC 尤其重要,因为它们在某种程度上与使用关系型数据库时的常规做法是相悖的。
聚合体(aggregate)是一组实体,确保在对它进行原子更改之间保持一致。一个经典的例子是 Order
与 OrderItems
。Order
上的一个属性(例如,numberOfItems
与实际 OrderItems
的数量一致)在更改时保持一致。
跨聚合的引用并不保证始终一致。它们最终会变得一致。
每个聚合体(aggregate)都有且仅有一个聚合根(aggregate root),该聚合根是聚合体中的一个实体。聚合体只能通过该聚合根的方法进行操作。这些操作就是前面提到的原子性变更。
一个仓库是对持久化存储的抽象,它看起来像是某种类型的所有聚合的集合。对于 Spring Data 而言,通常这意味着你希望每个聚合根都有一个 Repository
。此外,对于 Spring Data JDBC 来说,这意味着所有可以从聚合根访问的实体都被认为是该聚合根的一部分。Spring Data JDBC 假设只有聚合拥有指向存储聚合非根实体的表的外键,而其他实体不会指向这些非根实体。
注意
在当前实现中,从聚合根引用的实体由 Spring Data JDBC 删除并重新创建。
你可以根据自己的工作方式和数据库设计风格来覆盖存储库方法的实现。