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