现在,回到你的问题:
第一季度。这个序列生成器是否利用了数据库的增加
数值生成能力或在其上生成数字
拥有?
通过在@GeneratedValue 注释上使用GenerationType.SEQUENCE 策略,JPA 提供程序将尝试使用支持此功能的底层数据库(例如,Oracle、SQL Server、PostgreSQL、MariaDB)的数据库序列对象。
如果您使用的是不支持数据库序列对象的 MySQL,那么 Hibernate 将转而使用 GenerationType.TABLE,这是不可取的,因为 TABLE 生成性能很差。
所以,不要在 MySQL 中使用GenerationType.SEQUENCE 策略。
第二季度。如果 JPA 使用数据库自动增量功能,那么它会起作用吗
使用没有自动增量功能的数据存储?
当你说database auto-increment feature 时,我假设你在谈论GenerationType.IDENTITY。
要使用AUTO_INCREMENT 或IDENTITY 列,您需要在@GeneratedValue 注释上使用GenerationType.IDENTITYstrategy。
第三季度。如果 JPA 自己生成数值,那么 JPA 如何
实现知道接下来要生成哪个值?是否咨询
数据库首先查看最后存储了什么值,以便
生成值 (last + 1)?
JPA 提供程序自己生成值的唯一时间是您使用基于序列的优化器时,例如:
这些优化器用于减少数据库序列调用的数量,因此它们将使用单个数据库序列调用可以生成的标识符值的数量相乘。
为避免 Hibernate 标识符优化器与其他第 3 方客户端发生冲突,您应该使用 pooled 或 pooled-lo 而不是 hi/lo。即使您使用的是设计为使用 hi/lo 的旧版应用程序,您也可以migrate to the pooled or pooled-lo optimizers。
第四季度。还请说明sequenceName 和allocationSize
@SequenceGenerator 注解的属性。
sequenceName 属性定义用于生成标识符值的数据库序列对象。它是您使用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)