JPA主鍵策略

      在講主鍵策略之前首先簡單介紹一下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 指定生成器表中列是用來存儲最後生成的那個主鍵的值。

       

 

    

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