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