JPA的主鍵生成策略

數據的唯一性是很平常的要求,但是如果框架不能提供相關的控制而由程序員完全控制是很危險的,在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)
   )

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