现在,回到你的问题:
Q1。这个序列生成器是利用数据库不断增加的数值生成能力还是自己生成数字?
通过使用注释GenerationType.SEQUENCE
上的策略@GeneratedValue
,JPA 提供者将尝试使用支持此功能的底层数据库(例如,Oracle、SQL Server、PostgreSQL、MariaDB)的数据库序列对象。
如果您使用的是不支持数据库序列对象的 MySQL,那么 Hibernate 将回退到使用 the GenerationType.TABLE
instead,这是不可取的,因为 TABLE 生成性能很差。
所以,不要在GenerationType.SEQUENCE
MySQL 中使用该策略。
Q2。如果 JPA 使用数据库自动增量功能,那么它是否适用于没有自动增量功能的数据存储?
我假设您说的是GenerationType.IDENTITY
当您说database auto-increment feature
.
要使用AUTO_INCREMENT
orIDENTITY
列,您需要在注释上使用GenerationType.IDENTITY
策略。@GeneratedValue
Q3。如果 JPA 自己生成数值,那么 JPA 实现如何知道接下来要生成哪个值?它是否首先咨询数据库以查看最后存储的值以生成值(last + 1)?
JPA 提供程序自己生成值的唯一时间是当您使用基于序列的优化器时,例如:
这些优化器可以减少数据库序列调用的数量,因此它们将使用单个数据库序列调用可以生成的标识符值的数量相乘。
为了避免 Hibernate 标识符优化器和其他 3rd-party 客户端之间的冲突,您应该使用pooled
orpooled-lo
代替hi/lo
. 即使您使用的是设计为使用 hi/lo 的遗留应用程序,您也可以迁移到pooled
或pooled-lo
优化器。
Q4。还请阐明注释的属性sequenceName
和allocationSize
属性。@SequenceGenerator
该sequenceName
属性定义了用于生成标识符值的数据库序列对象。IT 是您使用CREATE SEQUENCE
DDL 语句创建的对象。
因此,如果您提供此映射:
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "seq_post"
)
@SequenceGenerator(
name = "seq_post"
)
private Long id;
Hibernate 将使用seq_post
数据库对象来生成标识符值:
SELECT nextval('hibernate_sequence')
定义标识符值乘数,如果您提供的allocationSize
值大于 1,那么 Hibernate 将使用pooled
优化器来减少数据库序列调用的次数。
因此,如果您提供此映射:
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "seq_post"
)
@SequenceGenerator(
name = "seq_post",
allocationSize = 5
)
private Long id;
然后,当您持久化 5 个实体时:
for (int i = 1; i <= 5; i++) {
entityManager.persist(
new Post().setTitle(
String.format(
"High-Performance Java Persistence, Part %d",
i
)
)
);
}
只会执行 2 个数据库序列调用,而不是 5 个:
SELECT nextval('hibernate_sequence')
SELECT nextval('hibernate_sequence')
INSERT INTO post (title, id)
VALUES ('High-Performance Java Persistence, Part 1', 1)
INSERT INTO post (title, id)
VALUES ('High-Performance Java Persistence, Part 2', 2)
INSERT INTO post (title, id)
VALUES ('High-Performance Java Persistence, Part 3', 3)
INSERT INTO post (title, id)
VALUES ('High-Performance Java Persistence, Part 4', 4)
INSERT INTO post (title, id)
VALUES ('High-Performance Java Persistence, Part 5', 5)