持久化实体
可以使用该方法保存聚合。
如果聚合是新的,则会导致聚合根的 insert,然后是所有直接或间接引用的实体的 insert 语句。CrudRepository.save(…)
如果聚合根不是新的,则所有引用的实体都将被删除,聚合根将被更新,并且所有引用的实体将再次插入。 请注意,实例是否为新实例是实例状态的一部分。
这种方法有一些明显的缺点。 如果实际只更改了很少的引用实体,则删除和插入是浪费。 虽然这个过程可以而且可能会得到改进,但 Spring Data JDBC 可以提供的功能存在一定的限制。 它不知道聚合的先前状态。 因此,任何更新过程都必须获取它在数据库中找到的任何内容,并确保将其转换为传递给 save 方法的实体的状态。 |
有关更多详细信息,另请参阅 Entity State Detection。
加载聚合
Spring Data JDBC 提供了两种加载聚合的方法:
-
传统的和 3.2 版本之前的 I 唯一方法非常简单: 每个查询都会单独加载聚合根,如果查询基于方法、派生查询或带注释的查询。 如果聚合根引用其他实体,则这些实体将加载单独的语句。
CrudRepository
-
Spring Data JDBC 3.2 允许使用单查询加载。 这样,就可以使用单个 SQL 查询完全加载任意数量的聚合。 这应该会明显更有效,尤其是对于由许多实体组成的复杂聚合。
目前,Single Query Loading 以不同的方式受到限制:
-
聚合不能有嵌套的集合,这包括 。 计划在将来消除此约束。
Map
-
聚合不得使用 或 embedded 实体。 计划在将来消除此约束。
AggregateReference
-
数据库方言必须支持它。在 Spring Data JDBC 提供的方言中,除 H2 和 HSQL 之外的所有方言都支持此功能。 H2 和 HSQL 不支持分析函数(又名窗口函数)。
-
它仅适用于 中的 find 方法,不适用于派生查询,也不适用于带注释的查询。 计划在将来消除此约束。
CrudRepository
-
需要在 中启用单查询加载,方法是调用
JdbcMappingContext
setSingleQueryLoadingEnabled(true)
-
如果未满足任何条件,则 Spring Data JDBC 将回退到加载聚合的默认方法。
Single Query Loading 被视为实验性。 我们感谢有关其工作原理的反馈。 |
虽然 Single Query Loading 可以缩写为 SQL,但我们强烈建议不要这样做,因为几乎可以保证与结构化查询语言的混淆。 |
ID 生成
Spring Data 使用 identifer 属性来标识实体。
实体的 ID 必须使用 Spring Data 的 @Id
注释进行注释。
当您的数据库具有 ID 列的自动增量列时,在将生成的值插入数据库后,将在实体中设置该值。
当实体是新实体并且标识符值默认为其初始值时,Spring Data 不会尝试插入标识符列的值。
这适用于基元类型,并且 identifier 属性使用数字包装器类型,例如 .0
null
Long
实体状态检测 详细介绍了检测实体是新实体还是应存在于数据库中的策略。
一个重要的约束是,在保存实体后,该实体不能再是新的。 请注意,实体是否为 new 是实体状态的一部分。 对于自增列,这会自动发生,因为 ID 是由 Spring Data 使用 ID 列中的值设置的。
模板 API
作为存储库的替代方案, Spring Data JDBC 提供了JdbcAggregateTemplate
作为在关系数据库中加载和持久化实体的更直接方法。
在很大程度上,存储库用于实现其功能。JdbcAggregateTemplate
本节仅重点介绍 .
有关更完整的概述,请参阅 的 JavaDoc。JdbcAggregateTemplate
JdbcAggregateTemplate
访问 JdbcAggregateTemplate
JdbcAggregateTemplate
旨在用作 Spring bean。
如果已将应用程序设置为包含 Spring Data JDBC,则可以在任何 Spring Bean 中配置依赖项,并且 Spring Framework 会注入正确配置的实例。JdbcAggregateTemplate
这包括用于为 Spring Data Repositories 实现自定义方法的片段,允许您用于自定义和扩展存储库。JdbcAggregateTemplate
坚持
JdbcAggregateTemplate
提供三种类型的方法来持久保存实体:、 和 。
每种都有两种风格:
对单个聚合进行操作,其名称与上述完全相同,并在 .save
insert
update
All
Iterable
save
与存储库中同名的方法相同。
insert
,如果实体是新实体,则跳过测试,并采用其名称指示的新聚合或现有聚合。update
查询
JdbcAggregateTemplate
提供了大量用于查询聚合和聚合集合的方法。
有一类方法需要特别注意。
这就是将 a 作为参数的方法。
它们允许执行以编程方式构建的查询,如下所示:Query
template.findOne(query(where("name").is("Gandalf")), Person.class);
该方法返回的 Query
定义要选择的列列表、where 子句(通过 CriteriaDefinition)以及 limit 和 offset 子句的规范。
有关该类的详细信息,请参阅其 JavaDoc。query
Query
Criteria
类是静态成员,它提供org.springframework.data.relational.core.query.CriteriaDefinition[]的实现,它表示查询的where子句。where
Criteria 类的方法
该类提供以下方法,所有这些方法都对应于 SQL 运算符:Criteria
-
Criteria
和 :将具有指定链接的 intag 添加到当前 URL 并返回新创建的 URL。(String column)
Criteria
property
Criteria
-
Criteria
或 :将具有指定链接的 链接到当前 并返回新创建的 链接。(String column)
Criteria
property
Criteria
-
Criteria
greaterThan :使用运算符创建标准。(Object o)
>
-
Criteria
greaterThanOrEquals :使用运算符创建标准。(Object o)
>=
-
Criteria
in :使用 varargs 参数的运算符创建标准。(Object… o)
IN
-
Criteria
in :使用运算符和集合创建标准。(Collection<?> collection)
IN
-
Criteria
is :使用列匹配 () 创建标准。(Object o)
property = value
-
Criteria
isNull :使用运算符创建标准。()
IS NULL
-
Criteria
isNotNull :使用运算符创建标准。()
IS NOT NULL
-
Criteria
lessThan :使用运算符创建标准。(Object o)
<
-
Criteria
lessThanOrEquals :使用运算符创建标准。(Object o)
⇐
-
Criteria
like :使用运算符创建标准,而不进行转义字符处理。(Object o)
LIKE
-
Criteria
not :使用运算符创建标准。(Object o)
!=
-
Criteria
notIn :使用 varargs 参数的运算符创建标准。(Object… o)
NOT IN
-
Criteria
notIn :使用运算符和集合创建标准。(Collection<?> collection)
NOT IN
乐观锁定
Spring Data 通过在聚合根上用 @Version
注释的 numeric 属性来支持乐观锁定。
每当 Spring Data 保存具有此类 version 属性的聚合时,都会发生两种情况:
-
聚合根的 update 语句将包含一个 where 子句,用于检查存储在数据库中的版本是否实际保持不变。
-
如果不是这种情况,就会被抛出。
OptimisticLockingFailureException
此外,version 属性在实体和数据库中都会增加,因此并发操作将注意到更改并引发如上所述的 if 适用。OptimisticLockingFailureException
此过程也适用于插入新聚合,其中 a 或 version 表示新实例,随后增加的实例将该实例标记为不再是新的,这使得这在对象构建期间生成 id 的情况(例如使用 UUID 时)非常有效。null
0
在删除期间,版本检查也适用,但不会增加版本。