天天看點

@GeneratedValue源碼解析

JPA要求每一個實體必須有且隻有一個主鍵,而@GeneratedValue提供了主鍵的生成政策,這就是@GeneratedValue注解存在的意義。本文将淺析@GeneratedValue的源碼。

@GeneratedValue的源碼如下:

@Target({METHOD, FIELD})說明該注解可以用于方法聲明和域聲明。

@Retention(RUNTIME)說明該注解在VM運作期間也可以保留,可以通過反射機制讀取注解的資訊。

如果不是很清楚,可參考@Controller和@Restcontroller源碼解析中有對元注解的介紹。

@GeneratedValue注解有兩個屬性,分别是strategy和generator,其中generator屬性的值是一個字元串,預設為"",其聲明了主鍵生成器的名稱。

檢視GenerationType的源碼,可以看到定義了四種主鍵生成政策:TABLE,SEQUENCE,IDENTITY,AUTO。

TABLE

使用資料庫表來生成主鍵。該政策一般與另外一個注解一起使用@TableGenerator,@TableGenerator注解指定了生成主鍵的表(可以在實體類上指定也可以在主鍵字段或屬性上指定),然後JPA将會根據注解内容自動生成一張表作為序清單(或使用現有的序清單)。如果不指定序清單,則會生成一張預設的序清單,表中的列名也是自動生成,資料庫上會生成一張名為sequence的表(SEQ_NAME,SEQ_COUNT)。序清單一般隻包含兩個字段:第一個字段是該生成政策的名稱,第二個字段是該關系表的最大序号,它會随着資料的插入逐漸累加。該政策的好處就是不依賴于外部環境和資料庫的具體實作,便于移植;但由于其不能充分利用資料庫的特性,是以不會優先使用。

SEQUENCE

使用序列來生成主鍵。 該政策的不足之處正好與TABLE相反,由于隻有部分資料庫(Oracle,PostgreSQL,DB2)支援序列對象,是以該政策一般不應用于其他資料庫。需要注意,MySQL不支援這種主鍵生成政策。該政策一般與另外一個注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主鍵的序列.然後JPA會根據注解内容建立一個序列(或使用一個現有的序列)。如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。

IDENTITY

使用資料庫ID自增長的方式來生成主鍵。 該政策在大部分資料庫中都提供了支援(指定方法或關鍵字可能不同),但還是有少數資料庫(Oracle)不支援,是以可移植性略差。

AUTO

自動選擇合适的主鍵生成政策。該政策比較常用,也是預設選項,@GeneratedValue(strategy = GenerationType.AUTO)相當于@GeneratedValue。

參考:JPA之@GeneratedValue注解。這篇介紹的挺詳細的,推薦一下。

由于部落客也是在攀登的路上,文中可能存在不當之處,歡迎各位多指教! 如果文章對您有用,那麼請點個”推薦“,以資鼓勵!

繼續閱讀