JPA主鍵生成策略


@GeneratedValue

  為一個實體類生成一個唯一標識的主鍵(JPA要求每一個實體Entity,必須有且只有一個主鍵)。它有兩個屬性,分別是strategy和generator。

  generator:默認為空字符串,它定義了主鍵生成器的名稱,對應的生成器有兩個:對應於同名的主鍵生成器@SequenceGenerator和@TableGenerator。

  strategy:一共有四種,被定義在枚舉類GenerationType中,包括:TABLE, SEQUENCE, IDENTITY 和AUTO。

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

1 @Id  
2 @GeneratedValue(strategy = GenerationType.TABLE, generator = "id_sequence")  
3 @TableGenerator(name = "id_sequence", allocationSize = 1, table = "sequence_table", pkColumnName = "sequence_max_id", valueColumnName = "sequence_count")  
4 private int id;

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

1 @Id  
2 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")  
3 @SequenceGenerator(name = "id_sequence", initialValue = 1, allocationSize = 1, sequenceName = "ID_SEQUENCE")  
4 private int id;

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

1 @Id  
2 @GeneratedValue(strategy = GenerationType.IDENTITY)  
3 private int id;

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

@GeneratedValue(strategy = GenerationType.AUTO)  
private int id;

 

@GenericGenerator:

   是HIbernate提供的自定義主鍵策略生成器,它需要和@GeneratedValue一起使用,並且它的name屬性要和@GeneratedValue中的generator名稱要一致。

  @GenericGenerator支持13種策略,分別是:

復制代碼
 1 static {  
 2 
 3   GENERATORS.put("uuid", UUIDHexGenerator.class);  
 4 
 5   GENERATORS.put("hilo", TableHiLoGenerator.class);  
 6 
 7   GENERATORS.put("assigned", Assigned.class);  
 8 
 9   GENERATORS.put("identity", IdentityGenerator.class);  
10 
11   GENERATORS.put("select", SelectGenerator.class);  
12 
13   GENERATORS.put("sequence", SequenceGenerator.class);  
14 
15   GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);  
16 
17   GENERATORS.put("increment", IncrementGenerator.class);  
18 
19   GENERATORS.put("foreign", ForeignGenerator.class);  
20 
21   GENERATORS.put("guid", GUIDGenerator.class);  
22 
23   GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated  
24 
25   GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);  
26 
27 }
復制代碼

上面的12種策略,再加上native,一共是13種。其實,這就是hibernate對JPA策略的一種拓展補充。舉個例子:

1 @GeneratedValue(generator = "paymentableGenerator") 
2 @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
3 private int id;

它會根據內部程序計算出32位長度的唯一id。

 

 

參考:

  http://blog.csdn.net/u012493207/article/details/50846616

  http://blog.csdn.net/tianxiezuomaikong/article/details/64930151

 原文地址:https://www.cnblogs.com/SummerinShire/p/7544897.html   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM