在講主鍵策略之前首先簡單介紹一下JPA。
JPA是一種java規範,而不是一種框架,而是一個ORM規範。JPA可以支持多種ORM框架,例如:hibernate,OpenJPA,TopLink,EclipseJPA等。JPA只是提供了統一的規範接口,最終實現由各個數據庫廠商來實現。這樣設計的目的是爲了解決項目中切換ORM框架,數據庫連接等所造成的成本。
我們在用JPA開發的時候,經常會在實體類的ID加上@GeneratedValue註解,用於生成表的主鍵。
例如:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
其中:strategy用於生命主鍵生成策略,JPA提供了四種主鍵生成的策略。
1.GenerationType.IDENTITY
id自增長,數據庫在新增一行數據的時候,自動給id賦值,類似於MySql新建表時,設計的列爲auto_increment,常見的數據庫基本上都支持該策略。
2.GenerationType.AUTO
自動從其他三種策略中選擇主鍵生成的策略,將主鍵生成的策略交給JPA來處理,JPA會根據不同的數據庫選擇合適的策略。
3.GenerationType.SEQUENCE
使用序列的方式生成主鍵,例如:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "testSeq")
@SequenceGenerator(initialValue = 1,name = "testSeq", sequenceName = "TEST_SEQUENCE")
private String id;
以上聲明相當於創建了一個序列,create sequence TEST_SEQUENCE;
如果不指定序列生成器的名稱,則使用廠商提供的默認序列生成器,比如Hibernate默認提供的序列名稱爲hibernate_sequence。
4.GenerationType.TABLE
該策略利用數據庫中的一個表來生成主鍵,可以不依賴於數據庫的具體實現,可以實現在不同的數據庫之間切換。
如果不指定表生成器,JPA廠商會使用默認的表,比如Hibernate在Oracle數據庫上會默認使用表hibernate_sequence。
例子:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "testSeq")
@TableGenerator(name ="PK_SEQ",table="SEQUENCE_TABLE",pkColumnName="SEQUENCE_NAME", valueColumnName = "SEQUENCE_COUNT")
private String id;
name屬性表示表生成器的名稱,table表示用哪個表來存儲生成的主鍵,pkColumnName用來指定生成器表中的那一列來存儲主鍵,valueColumnName 指定生成器表中列是用來存儲最後生成的那個主鍵的值。