07.03 Hibernate JPA主鍵策略

JPA的4種策略,分別為:AUTO策略,Sequence策略,Identity策略,Table策略。

一、AUTO策略

auto策略是JPA默認的策略,在hibernate的代碼 GenerationType.AUTO 進行定義。使用 AUTO 策略就是將主鍵生成的策略交給持久化引擎 (persistence engine) 來決定,由它自己從 Table 策略,Sequence 策略和 Identity策略三種策略中選擇最合適的。不同的持久化引擎 、不同的數據庫一般策略不同。比如oracle最常用的就是sequence,mysql最常用的就是identify,因為oracle數據庫支持sequence,而mysql數據庫則 是隻支持auto_increment 。

@Entity
@Table(name = "t_customer")
public class Customer {
\t@Id
\t@GeneratedValue(strategy = GenerationType.AUTO)
\t@Column(name = "id")
\tprivate Integer id;

使用的是mysql對應的數據庫表如下:

Hibernate JPA主鍵策略

注意:

1、如果是mysql數據庫,一定要將主鍵列設置成自增長的,否則使用AUTO策略的時候,會報錯:

org.hibernate.exception.GenericJDBCException: Field 'id' doesn't have a default value

2、如果是oracle數據庫,那麼會使用hibernate_sequence,這個名稱是固定的,不能更改。

二、Sequence策略

對應Hibernate代碼 GenerationType.SEQUENCE 。一些數據庫,如oracle就會內置"序列生成器"。為了使用序列,我們需要使用JPA的sequence策略。

@Entity
@Table(name = "t_customer")
public class Customer {
\t@Id
\t@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySeqGenerator")
\t@SequenceGenerator(name = "mySeqGenerator", sequenceName = "t_customer_sequence", initialValue = 1000, allocationSize = 50)
\t@Column(name = "id")

這裡需要配合使用@SequenceGenerator,用來指定序列的相關信息。

name:序列生成器的名稱,會在@GeneratedValue中進行引用

sequenceName:oracle數據庫中的序列生成器名稱

initialValue:主鍵的初始值

allocationSize:主鍵每次增長值的大小

注意:如果底層數據庫不執行序列,會報錯:

org.hibernate.MappingException: org.hibernate.dialect.MySQLDialect does not support sequences

三、Identity策略

對應Hibernate代碼 GenerationType.IDENTITY 。 這個很適合像mysql這樣的數據庫,提供了對自增主鍵的支持。

@Entity
@Table(name = "t_customer")
public class Customer {
\t@Id
\t@GeneratedValue(strategy = GenerationType.IDENTITY)
\t@Column(name = "id")
\tprivate Integer id;

使用比較簡單,這裡不需要做詳細介紹了

四、Table策略

對應Hibernate代碼 GenerationType.TABLE 。 使用一張特殊的數據庫表,保存插入記錄的時,需要的主鍵值。

@Entity
@Table(name = "t_customer")
public class Customer {
\t@Id
\t@GeneratedValue(strategy = GenerationType.TABLE, generator = "myTableGenerator")
\t@TableGenerator(name = "myTableGenerator", table = "hibernateNeedTable", pkColumnName = "pk_key", valueColumnName = "pk_value", pkColumnValue = "customerId", initialValue = 100, allocationSize = 1000)
\tprivate Integer id;

直接上圖和執行的sql語句,讀者只需要簡單理解下,就能明白這些屬性的含義了。

1、數據庫中多了一張表

Hibernate JPA主鍵策略

2、實際發出的sql語句如下:

Hibernate: 
select
pk_value
from
hibernateNeedTable
where
pk_key = 'customerId' for update

Hibernate:
update
hibernateNeedTable
set
pk_value = ?
where
pk_value = ?
and pk_key = 'customerId'
Hibernate:
insert
into
t_customer
(id,name)
values
(?, ?)

看到這裡,大家應該明白了這些屬性的用法了。值得一提的是,這個表可以給無數的表作為主鍵表,只是添加一條記錄而以(需要保證table、pkColumnName、valueColumnName三個屬性值相同就可以了。

Hibernate JPA主鍵策略


分享到:


相關文章: