JPA 生成策略 TABLE 和 SEQUENCE 之间的区别

Difference between JPA generation Strategy TABLE and SEQUENCE

提问人:Haseeb Wali 提问时间:1/1/2020 最后编辑:BalusCHaseeb Wali 更新时间:1/2/2020 访问量:717

问:

我正在将Spring boot与MySql和Hibernate一起使用。我有一个简单的应用程序,我有用户表。

@Entity(name = "user")
Public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private int Id;
    // Getters Setters and remaining attributes

然后我使用 Spring Transaction 在用户表中插入 20 条记录

for(int i = 0; i < 20; i++) 
 userService.save(new User("fName"+i, "lName"+i);

我可以看到所有 20 个插入查询的以下输出

Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)

根据我对 GenerationType.SEQUENCE 的理解,它应该只从数据库查询一次,之后休眠不应该从 DATABASE 查询下一个序列并继续生成序列,直到它达到下一个 allocationSize(默认为 50)。为什么它总是在数据库中查询所有 ID。 在我看来,这种行为应该反映在GenertaionType.TABLE中(如果我改变它,就会发生这种情况)

JPA 序列

评论

1赞 Oleksandr Lykhonosov 1/1/2020
看看下面的文章 vladmihalcea.com/...
0赞 Teodor Dimitrov 1/1/2020
我相信这种行为是很正常的。在本例中,数据库中只有一个序列。为了分配新的 id,hibernate 每次都需要从数据库中的序列中调用 next_val。hibernate_sequence是新 ID 的单点。
0赞 Ortomala Lokni 1/2/2020
哪个版本的 MySQL?您是否指定了 Hibernate 方言?
1赞 Powerlord 1/2/2020
我的印象是生成类型仅适用于 PostgreSQL 和 Oracle。SEQUENCE
0赞 Haseeb Wali 1/3/2020
@Teodor Dinitrov,但我的理解是,即使您使用单个表,它也不应该查询数据库以创建所有 ID

答: 暂无答案