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