mysql hibernate_sequence 修改(hibernate設置自增)

public class GWgDyEntity implements Serializable {
2 
3 //在主鍵上添加註釋:
4 @Id
5 @GeneratedValue(strategy = GenerationType.AUTO)
6 @Column(name = "OBJECTID")
7 public long getObjectid() {
8     return objectid;
9 }

如果在Hibernate 5上運行相同的單元測試,您將獲得以下SQL語句:

1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18歲
19
20
21
22
23
24
25
26
SELECT next_val as id_val
FROM hibernate_sequence FOR UPDATE
 
UPDATE hibernate_sequence
SET next_val= 2 where next_val=1
 
SELECT next_val as id_val
FROM hibernate_sequence FOR UPDATE
 
UPDATE hibernate_sequence
SET next_val= 3 where next_val=1
 
SELECT next_val as id_val
FROM hibernate_sequence FOR UPDATE
 
UPDATE hibernate_sequence
SET next_val= 4 where next_val=3
 
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)

發生什麼事了 好吧,當基礎數據庫不支持序列時,Hibernate選擇TABLE生成器,而不是選擇生成器IDENTITY。但是,TABLE生成器不是一個好的選擇。請查看HHH-11014 Jira問題,以獲取與此行爲更改相關的更多詳細信息。

如何解決?

該修復程序非常簡單。您只需要使用native標識符即可:

1個
2
3
4
5
6
7
8
9
10
@Id
@GeneratedValue(
    strategy= GenerationType.AUTO,
    generator="native"
)
@GenericGenerator(
    name = "native",
    strategy = "native"
)
private Long id;

現在,在運行先前的測試用例時,Hibernate改爲使用IDENTITY列:

1個
2
3
4
5
6
7
8
INSERT INTO post (title)
VALUES ('High-Performance Java Persistence, Part 1')
 
INSERT INTO post (title)
VALUES ('High-Performance Java Persistence, Part 2')
 
INSERT INTO post (title)
VALUES ('High-Performance Java Persistence, Part 3')

如果您想使用一種可移植的解決方案來管理自定義SEQUENCE生成器,同時仍然允許您選擇IDENTITYMySQL 的生成器,那麼請查看本文

結論

JPA可移植性是一個神話!實際上,如果您需要高性能的企業應用程序,則必須瞭解底層JPA提供程序的詳細信

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章