數據的唯一性是很平常的要求,但是如果框架不能提供相關的控制而由程序員完全控制是很危險的,在JPA中,有下面四種策略。
A.容器自動生成---GeneratorType.AUTO
由JPA自動生成
B.使用數據庫的自動增長字段生成---GenerationType.IDENTITY
JPA 容器將使用數據庫的自增長字段爲新增加的實體對象賦唯一值。這種情況下需要數據庫提供對自增長字段的支持,SQL Server、MySQL、DB2、Derby等支持。
C.根據數據庫序列號(Sequence)生成 ---GenerationType.SEQUENCE
表示使用數據庫的序列號爲新增加的實體對象賦唯一值。這種情況下需要數據庫提供對序列號的支持常用的數據庫中,Oracle支持。
D.使用數據庫表的字段生成---GenerationType.TABLE
表示使用數據庫中指定表的某個字段記錄實體對象的標識,通過該字段的增長爲新增加的實體對象賦唯一值
比較特殊的地方
1. 使用UUID(兩個不同實現版本Hibernate和OpenJPA有點不同)
OpenJPA
@GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid")
Hibernate(Eclipse會提示錯誤,但是程序是可以運行的)
@GenericGenerator(name = "test", strategy = "uuid")
@GeneratedValue(generator = "test")
其實這兩種辦法我感覺都不是特別好,因爲他們跟實現有關係,將來如果要遷移的話會比較麻煩,所以可以直接用java.util.UUID
user.setUserId(UUID.randomUUID().toString());
2.使用@GeneratedValue(strategy=GenerationType.IDENTITY)
需要在數據庫(Derby)中這樣定義字段
USER_ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)
3.如果使用數據庫表的字段生成---GenerationType.TABLE
對於Hibernate,需要創建生成主鍵的表,但是OpenJPA不需要,如果沒有會自動生成。
代碼如下:
@TableGenerator(name = "test111", table = "IDTABLE",
pkColumnName = "KEYID", valueColumnName = "KEYVALUE", pkColumnValue = "TestUSER_ID")
@GeneratedValue(strategy=GenerationType.TABLE, generator="test111")
CREATE TABLE IDTABLE (
KEYID VARCHAR(255) NOT NULL,
KEYVALUE BIGINT,
PRIMARY KEY (KEYID)
)