持久化实体

可以使用该方法保存聚合。 如果聚合是新的,则会导致聚合根的 insert,然后是所有直接或间接引用的实体的 insert 语句。CrudRepository.save(…)spring-doc.cn

如果聚合根不是新的,则所有引用的实体都将被删除,聚合根将被更新,并且所有引用的实体将再次插入。 请注意,实例是否为新实例是实例状态的一部分。spring-doc.cn

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

有关更多详细信息,另请参阅 Entity State Detectionspring-doc.cn

加载聚合

Spring Data JDBC 提供了两种加载聚合的方法:spring-doc.cn

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

  2. Spring Data JDBC 3.2 允许使用单查询加载。 这样,就可以使用单个 SQL 查询完全加载任意数量的聚合。 这应该会明显更有效,尤其是对于由许多实体组成的复杂聚合。spring-doc.cn

    目前,Single Query Loading 以不同的方式受到限制:spring-doc.cn

    1. 聚合不能有嵌套的集合,这包括 。 计划在将来消除此约束。Mapspring-doc.cn

    2. 聚合不得使用 或 embedded 实体。 计划在将来消除此约束。AggregateReferencespring-doc.cn

    3. 数据库方言必须支持它。在 Spring Data JDBC 提供的方言中,除 H2 和 HSQL 之外的所有方言都支持此功能。 H2 和 HSQL 不支持分析函数(又名窗口函数)。spring-doc.cn

    4. 它仅适用于 中的 find 方法,不适用于派生查询,也不适用于带注释的查询。 计划在将来消除此约束。CrudRepositoryspring-doc.cn

    5. 需要在 中启用单查询加载,方法是调用JdbcMappingContextsetSingleQueryLoadingEnabled(true)spring-doc.cn

如果未满足任何条件,则 Spring Data JDBC 将回退到加载聚合的默认方法。spring-doc.cn

Single Query Loading 被视为实验性。 我们感谢有关其工作原理的反馈。
虽然 Single Query Loading 可以缩写为 SQL,但我们强烈建议不要这样做,因为几乎可以保证与结构化查询语言的混淆。

ID 生成

Spring Data 使用 identifer 属性来标识实体。 实体的 ID 必须使用 Spring Data 的 @Id 注释进行注释。spring-doc.cn

当您的数据库具有 ID 列的自动增量列时,在将生成的值插入数据库后,将在实体中设置该值。spring-doc.cn

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

实体状态检测 详细介绍了检测实体是新实体还是应存在于数据库中的策略。spring-doc.cn

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

模板 API

作为存储库的替代方案, Spring Data JDBC 提供了JdbcAggregateTemplate作为在关系数据库中加载和持久化实体的更直接方法。 在很大程度上,存储库用于实现其功能。JdbcAggregateTemplatespring-doc.cn

本节仅重点介绍 . 有关更完整的概述,请参阅 的 JavaDoc。JdbcAggregateTemplateJdbcAggregateTemplatespring-doc.cn

访问 JdbcAggregateTemplate

JdbcAggregateTemplate旨在用作 Spring bean。 如果已将应用程序设置为包含 Spring Data JDBC,则可以在任何 Spring Bean 中配置依赖项,并且 Spring Framework 会注入正确配置的实例。JdbcAggregateTemplatespring-doc.cn

这包括用于为 Spring Data Repositories 实现自定义方法的片段,允许您用于自定义和扩展存储库。JdbcAggregateTemplatespring-doc.cn

坚持

JdbcAggregateTemplate提供三种类型的方法来持久保存实体:、 和 。 每种都有两种风格: 对单个聚合进行操作,其名称与上述完全相同,并在 .saveinsertupdateAllIterablespring-doc.cn

save与存储库中同名的方法相同。spring-doc.cn

insert,如果实体是新实体,则跳过测试,并采用其名称指示的新聚合或现有聚合。updatespring-doc.cn

查询

JdbcAggregateTemplate提供了大量用于查询聚合和聚合集合的方法。 有一类方法需要特别注意。 这就是将 a 作为参数的方法。 它们允许执行以编程方式构建的查询,如下所示:Queryspring-doc.cn

template.findOne(query(where("name").is("Gandalf")), Person.class);

该方法返回的 Query 定义要选择的列列表、where 子句(通过 CriteriaDefinition)以及 limit 和 offset 子句的规范。 有关该类的详细信息,请参阅其 JavaDoc。queryQueryspring-doc.cn

Criteria类是静态成员,它提供org.springframework.data.relational.core.query.CriteriaDefinition[]的实现,它表示查询的where子句。wherespring-doc.cn

Criteria 类的方法

该类提供以下方法,所有这些方法都对应于 SQL 运算符:Criteriaspring-doc.cn

  • Criteria :将具有指定链接的 intag 添加到当前 URL 并返回新创建的 URL。(String column)CriteriapropertyCriteriaspring-doc.cn

  • Criteria :将具有指定链接的 链接到当前 并返回新创建的 链接。(String column)CriteriapropertyCriteriaspring-doc.cn

  • Criteria greaterThan :使用运算符创建标准。(Object o)>spring-doc.cn

  • Criteria greaterThanOrEquals :使用运算符创建标准。(Object o)>=spring-doc.cn

  • Criteria in :使用 varargs 参数的运算符创建标准。(Object…​ o)INspring-doc.cn

  • Criteria in :使用运算符和集合创建标准。(Collection<?> collection)INspring-doc.cn

  • Criteria is :使用列匹配 () 创建标准。(Object o)property = valuespring-doc.cn

  • Criteria isNull :使用运算符创建标准。()IS NULLspring-doc.cn

  • Criteria isNotNull :使用运算符创建标准。()IS NOT NULLspring-doc.cn

  • Criteria lessThan :使用运算符创建标准。(Object o)<spring-doc.cn

  • Criteria lessThanOrEquals :使用运算符创建标准。(Object o)spring-doc.cn

  • Criteria like :使用运算符创建标准,而不进行转义字符处理。(Object o)LIKEspring-doc.cn

  • Criteria not :使用运算符创建标准。(Object o)!=spring-doc.cn

  • Criteria notIn :使用 varargs 参数的运算符创建标准。(Object…​ o)NOT INspring-doc.cn

  • Criteria notIn :使用运算符和集合创建标准。(Collection<?> collection)NOT INspring-doc.cn

乐观锁定

Spring Data 通过在聚合根上用 @Version 注释的 numeric 属性来支持乐观锁定。 每当 Spring Data 保存具有此类 version 属性的聚合时,都会发生两种情况:spring-doc.cn

  • 聚合根的 update 语句将包含一个 where 子句,用于检查存储在数据库中的版本是否实际保持不变。spring-doc.cn

  • 如果不是这种情况,就会被抛出。OptimisticLockingFailureExceptionspring-doc.cn

此外,version 属性在实体和数据库中都会增加,因此并发操作将注意到更改并引发如上所述的 if 适用。OptimisticLockingFailureExceptionspring-doc.cn

此过程也适用于插入新聚合,其中 a 或 version 表示新实例,随后增加的实例将该实例标记为不再是新的,这使得这在对象构建期间生成 id 的情况(例如使用 UUID 时)非常有效。null0spring-doc.cn

在删除期间,版本检查也适用,但不会增加版本。spring-doc.cn