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