1. 程式人生 > >JPA之@GeneratedValue註解(轉)

JPA之@GeneratedValue註解(轉)

主鍵 如果 保存 tail postgres evel private ech 數據庫表

JPA的@GeneratedValue註解,在JPA中,@GeneratedValue註解存在的意義主要就是為一個實體生成一個唯一標識的主鍵(JPA要求每一個實體Entity,必須有且只有一個主鍵),@GeneratedValue提供了主鍵的生成策略。@GeneratedValue註解有兩個屬性,分別是strategy和generator,其中generator屬性的值是一個字符串,默認為"",其聲明了主鍵生成器的名稱(對應於同名的主鍵生成器@SequenceGenerator和@TableGenerator)。

JPA為開發人員提供了四種主鍵生成策略,其被定義在枚舉類GenerationType中,包括GenerationType.TABLE,GenerationType.SEQUENCE,GenerationType.IDENTITY和GenerationType.AUTO。下面分別介紹這四種主鍵生成策略。

1.GenerationType.TABLE

使用一個特定的數據庫表格來保存主鍵,持久化引擎通過關系數據庫的一張特定的表格來生成主鍵,這種策略的好處就是不依賴於外部環境和數據庫的具體實現,在不同數據庫間可以很容易的進行移植,但由於其不能充分利用數據庫的特性,所以不會優先使用。該策略一般與另外一個註解一起使用@TableGenerator,@TableGenerator註解指定了生成主鍵的表(可以在實體類上指定也可以在主鍵字段或屬性上指定),然後JPA將會根據註解內容自動生成一張表作為序列表(或使用現有的序列表)。如果不指定序列表,則會生成一張默認的序列表,表中的列名也是自動生成,數據庫上會生成一張名為sequence的表(SEQ_NAME,SEQ_COUNT)。序列表一般只包含兩個字段:第一個字段是該生成策略的名稱,第二個字段是該關系表的最大序號,它會隨著數據的插入逐漸累加。類似於

[java] view plain copy
  1. @Id
  2. @GeneratedValue(strategy = GenerationType.TABLE, generator = "roleSeq")
  3. @TableGenerator(name = "roleSeq", allocationSize = 1, table = "seq_table", pkColumnName = "seq_id", valueColumnName = "seq_count")
  4. private Integer id;

在以上例子中,roleSeq唯一的標識了該生成器,在@GeneratedValue註解中的generator屬性可以根據此標識來聲明主鍵生成器。

2.GenerationType.SEQUENCE

在某些數據庫中,不支持主鍵自增長,比如Oracle,其提供了一種叫做"序列(sequence)"的機制生成主鍵。此時,GenerationType.SEQUENCE就可以作為主鍵生成策略。該策略的不足之處正好與TABLE相反,由於只有部分數據庫(Oracle,PostgreSQL,DB2)支持序列對象,所以該策略一般不應用於其他數據庫。類似的,該策略一般與另外一個註解一起使用@SequenceGenerator,@SequenceGenerator註解指定了生成主鍵的序列.然後JPA會根據註解內容創建一個序列(或使用一個現有的序列)。如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。類似於

[java] view plain copy
  1. @Id
  2. @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "menuSeq")
  3. @SequenceGenerator(name = "menuSeq", initialValue = 1, allocationSize = 1, sequenceName = "MENU_SEQUENCE")
  4. private Integer id;

同樣,在以上例子中,menuSeq唯一的標識了該生成器,@SequenceGenerator可以理解為將數據庫中存在的序列進行了一個映射,在@GeneratedValue註解中的generator屬性可以根據此標識來聲明主鍵生成器。
3.GenerationType.IDENTITY

此種主鍵生成策略就是通常所說的主鍵自增長,數據庫在插入數據時,會自動給主鍵賦值,比如MYSQL可以在創建表時聲明"auto_increment" 來指定主鍵自增長。該策略在大部分數據庫中都提供了支持(指定方法或關鍵字可能不同),但還是有少數數據庫不支持,所以可移植性略差。使用自增長主鍵生成策略是只需要聲明strategy = GenerationType.IDENTITY即可。類似於

[java] view plain copy
  1. @Id
  2. @GeneratedValue(strategy = GenerationType.IDENTITY)
  3. private Integer id;

需要註意的是,同一張表中自增列最多只能有一列。

4.GenerationType.AUTO

把主鍵生成策略交給持久化引擎(persistence engine),持久化引擎會根據數據庫在以上三種主鍵生成策略中選擇其中一種。此種主鍵生成策略比較常用,由於JPA默認的生成策略就是GenerationType.AUTO,所以使用此種策略時.可以顯式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue

類似於

[java] view plain copy
  1. @GeneratedValue(strategy = GenerationType.AUTO)
  2. private Integer id;

[java] view plain copy
  1. @GeneratedValue
  2. private Integer id;

參考資料:

http://xiaoyaocao.iteye.com/blog/1874412

http://www.ibm.com/developerworks/cn/java/j-lo-jpaprimarykey/

http://www.oracle.com/technetwork/cn/middleware/ias/toplink-jpa-annotations-100895-zhs.html#

測試實例

http://download.csdn.net/detail/u012493207/9456135

JPA之@GeneratedValue註解(轉)