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