https://blog.csdn.net/u011781521/article/details/72210980sql
JPA提供的四種標準用法爲TABLE,SEQUENCE,IDENTITY,AUTO. 數據庫
TABLE:使用一個特定的數據庫表格來保存主鍵。
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。
IDENTITY:主鍵由數據庫自動生成(主要是自動增加型)
AUTO:主鍵由程序控制。
ui
GenerationType.TABLEspa
使用一個特定的數據庫表格來保存主鍵,持久化引擎經過關係數據庫的一張特定的表格來生成主鍵,這種策略的好處就是不依賴於外部環境和數據庫的具體實現,在不一樣數據庫間能夠很容易的進行移植,但因爲其不能充分利用數據庫的特性,因此不會優先使用。該策略通常與另一個註解一塊兒使用@TableGenerator,@TableGenerator註解指定了生成主鍵的表(能夠在實體類上指定也能夠在主鍵字段或屬性上指定),而後JPA將會根據註解內容自動生成一張表做爲序列表(或使用現有的序列表)。若是不指定序列表,則會生成一張默認的序列表,表中的列名也是自動生成,數據庫上會生成一張名爲sequence的表(SEQ_NAME,SEQ_COUNT)。序列表通常只包含兩個字段:第一個字段是該生成策略的名稱,第二個字段是該關係表的最大序號,它會隨着數據的插入逐漸累加。.net
@Id @Column(name="id") @GeneratedValue(strategy=GenerationType.TABLE,generator="table_gen") @TableGenerator( name = "table_gen", table="fendo_generator", pkColumnName="seq_name", //指定主鍵的名字 pkColumnValue="fendos", //指定下次插入主鍵時使用默認的值 valueColumnName="seq_id", //該主鍵當前所生成的值,它的值將會隨着每次建立累加 initialValue = 1, //初始化值 allocationSize=1 //累加值 ) public Integer getUid() { return uid; }
GenerationType.SEQUENCEcode
在某些數據庫中,不支持主鍵自增加,好比Oracle,其提供了一種叫作"序列(sequence)"的機制生成主鍵。此時,GenerationType.SEQUENCE就能夠做爲主鍵生成策略。該策略的不足之處正好與TABLE相反,因爲只有部分數據庫(Oracle,PostgreSQL,DB2)支持序列對象,MYsql不支持序列,因此該策略通常不該用於其餘數據庫。相似的,該策略通常與另一個註解一塊兒使用@SequenceGenerator,@SequenceGenerator註解指定了生成主鍵的序列.而後JPA會根據註解內容建立一個序列(或使用一個現有的序列)。若是不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。對象
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="fendo_seq") @SequenceGenerator(name="fendo_seq", sequenceName="seq_name")
GenerationType.IDENTITYblog
此種主鍵生成策略就是一般所說的主鍵自增加,數據庫在插入數據時,會自動給主鍵賦值,好比MySQL能夠在建立表時聲明"auto_increment" 來指定主鍵自增加。該策略在大部分數據庫中都提供了支持(指定方法或關鍵字可能不一樣),但仍是有少數數據庫不支持,因此可移植性略差。使用自增加主鍵生成策略是隻須要聲明strategy = GenerationType.IDENTITY便可。rem
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.AUTOget
把主鍵生成策略交給持久化引擎(persistence engine),持久化引擎會根據數據庫在以上三種主鍵生成策略中選擇其中一種。此種主鍵生成策略比較經常使用,因爲JPA默認的生成策略就是GenerationType.AUTO,因此使用此種策略時.能夠顯式的指定@GeneratedValue(strategy = GenerationType.AUTO)也能夠直接@GeneratedValue。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)