序列支持
主键属性(使用 @Id 注解标注)也可以使用 @Sequence 注解进行标注。
@Sequence 注解的存在表明,该属性的初始值应在保存对象时从数据库序列中获取。
数据库生成序列的能力由所使用的数据库方言决定。
如果没有 @Sequence 注解,则假定对应列的值在插入行时由数据库自动生成。
考虑以下实体:
使用序列生成 ID 的实体
@Table
class MyEntity {
@Id
@Sequence(
sequence = "my_seq",
schema = "public"
)
private Long id;
// …
}
在持久化此实体时,Spring Data 会在执行 SQL INSERT 语句之前,先发出一个额外的 SELECT 语句,以从序列中获取下一个值。
例如,对于 PostgreSQL,Spring Data 发出的查询将如下所示:
在 PostgreSQL 中选择下一个序列值
SELECT nextval('public.my_seq');
在插入期间,获取到的标识符值包含在 VALUES 中:
插入语句中包含 Id 值
INSERT INTO "my_entity"("id", "name") VALUES(?, ?);
| 从序列中获取值和实际的插入语句是两个独立的操作。 我们强烈建议在事务环境中执行这些操作,以确保原子性。 |
支持的方言
以下方言支持序列(Sequences):
-
H2
-
HSQL
-
PostgreSQL
-
DB2
-
Oracle
-
Microsoft SQL Server
请注意,MySQL 不支持序列(sequences)。