对于最新的稳定版本,请使用 Spring Data Relational 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data Relational 3.3.1Spring中文文档

可以使用该方法执行保存聚合。 如果聚合是新的,则会导致对聚合根进行插入,然后为所有直接或间接引用的实体提供插入语句。CrudRepository.save(…)Spring中文文档

如果聚合根不是新的,则删除所有引用的实体,更新聚合根,并重新插入所有引用的实体。 请注意,实例是否为新实例是实例状态的一部分。Spring中文文档

这种方法有一些明显的缺点。 如果实际更改的引用实体中只有很少的实体,则删除和插入是浪费。 虽然这个过程可以而且可能会得到改进,但Spring Data JDBC可以提供的内容有一定的局限性。 它不知道聚合的先前状态。 因此,任何更新过程都必须获取它在数据库中找到的任何内容,并确保将其转换为传递给 save 方法的实体的任何状态。

有关更多详细信息,另请参阅实体状态检测Spring中文文档

这种方法有一些明显的缺点。 如果实际更改的引用实体中只有很少的实体,则删除和插入是浪费。 虽然这个过程可以而且可能会得到改进,但Spring Data JDBC可以提供的内容有一定的局限性。 它不知道聚合的先前状态。 因此,任何更新过程都必须获取它在数据库中找到的任何内容,并确保将其转换为传递给 save 方法的实体的任何状态。

加载聚合

Spring Data JDBC 提供了两种加载聚合的方法:Spring中文文档

  1. 传统的和 3.2 之前的版本唯一的方法非常简单: 如果查询基于方法、派生查询或带批注的查询,则每个查询都会独立加载聚合根。 如果聚合根引用其他实体,则这些实体将加载单独的语句。CrudRepositorySpring中文文档

  2. Spring Data JDBC 3.2 允许使用单查询加载。 这样,就可以通过单个 SQL 查询完全加载任意数量的聚合。 这应该会更有效,特别是对于由许多实体组成的复杂聚合。Spring中文文档

    目前,单查询加载以不同的方式受到限制:Spring中文文档

    1. 聚合不得具有嵌套集合,这包括 . 计划是在未来消除这一限制。MapSpring中文文档

    2. 聚合不得使用或嵌入实体。 计划是在未来消除这一限制。AggregateReferenceSpring中文文档

    3. 数据库方言必须支持它。在 Spring Data JDBC 提供的方言中,除了 H2 和 HSQL 之外,其他所有方言都支持这一点。 H2 和 HSQL 不支持分析函数(又称窗口函数)。Spring中文文档

    4. 它仅适用于 中的 find 方法,不适用于派生查询,也不适用于带注释的查询。 计划是在未来消除这一限制。CrudRepositorySpring中文文档

    5. 需要在 中启用单个查询加载,方法是调用JdbcMappingContextsetSingleQueryLoadingEnabled(true)Spring中文文档

如果不满足任何条件,Spring Data JDBC 将回退到加载聚合的默认方法。Spring中文文档

单查询加载被视为实验性。 我们感谢您对它如何工作的反馈。
虽然单查询加载可以缩写为 SQL,但我们强烈建议不要这样做,因为几乎可以保证与结构化查询语言混淆。
单查询加载被视为实验性。 我们感谢您对它如何工作的反馈。
虽然单查询加载可以缩写为 SQL,但我们强烈建议不要这样做,因为几乎可以保证与结构化查询语言混淆。

ID生成

Spring Data 使用 identifer 属性来标识实体。 实体的 ID 必须使用 Spring Data 的 @Id 注释进行注释。Spring中文文档

当数据库具有 ID 列的自动递增列时,生成的值在插入数据库后会在实体中设置。Spring中文文档

当实体是新的并且标识符值默认为其初始值时,Spring Data 不会尝试插入标识符列的值。 这适用于基元类型,并且标识符属性使用数字包装类型,例如 。0nullLongSpring中文文档

实体状态检测详细介绍了检测实体是否为新实体或该实体是否预期存在于数据库中的策略。Spring中文文档

一个重要的约束是,在保存实体后,该实体不能再是新的。 请注意,实体是否为新实体是实体状态的一部分。 对于自动递增列,这会自动发生,因为 ID 由 Spring Data 使用 ID 列中的值设置。Spring中文文档

乐观锁定

Spring Data 通过在聚合根上用@Version注释的数值属性来支持乐观锁定。 每当Spring Data保存具有此类版本属性的聚合时,都会发生两件事:Spring中文文档

  • 聚合根目录的 update 语句将包含一个 where 子句,用于检查数据库中存储的版本是否实际未更改。Spring中文文档

  • 如果不是这种情况,则会抛出一个。OptimisticLockingFailureExceptionSpring中文文档

此外,在实体和数据库中,version 属性都会增加,因此并发操作将注意到更改并抛出一个(如果适用),如上所述。OptimisticLockingFailureExceptionSpring中文文档

此过程也适用于插入新聚合,其中 or version 表示新实例,然后增加的实例将该实例标记为不再是新实例,这使得这在对象构造期间生成 id 的情况下(例如使用 UUID 时)非常有效。null0Spring中文文档

在删除期间,版本检查也适用,但不会增加版本。Spring中文文档