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
生成器,同時仍然允許您選擇IDENTITY
MySQL 的生成器,那麼請查看本文。
結論
JPA可移植性是一個神話!實際上,如果您需要高性能的企業應用程序,則必須瞭解底層JPA提供程序的詳細信