JPA通過@GeneratedValue注解配置主鍵的生成策略,通過strategy屬性選擇預定的4種策略之一。
- GenerationType.AUTO:默認選項,由程序自動選擇一個最適合底層數據庫的主鍵生成策略;
- GenerationType.IDENTITY:表自增長字段,Oracle不支持這種方式。
- GenerationType.SEQUENCE:通過序列產生主鍵,該策略一般與注解@SequenceGenerator一起使用,根據注解內容創建一個序列或使用一個現有的序列,如果不指定序列,則會自動生成一個序列SEQ_GEN_SEQUENCE。注意:MySQL不支持這種方式。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "testSeq")
@SequenceGenerator(name = "testSeq", initialValue = 1, allocationSize = 1, sequenceName = "TEST_SEQUENCE"
private Long id;
- GenerationType.TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易於數據庫移植。該策略常與@TableGenerator一同使用。可以在主鍵字段或屬性或者實體類上使用@TableGenerator,指定生成或使用一張現有的序列表,如果不指定序列表,則會生成一張默認的序列表,表中的列名(SEQ_NAME,SEQ_COUNT)也是自動生成。序列表一般只包含兩個字段:第一個字段是策略名稱,第二個字段是該關系表的最大序號,它會隨着數據的插入逐漸累加。該策略的好處就是不依賴於外部環境和數據庫的具體實現,便於移植,但由於其不能充分利用數據庫的特性,所以不會優先使用。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "testGenerator")
@TableGenerator(name = "testGenerator", allocationSize = 1, table = "test_table", pkColumnName = "test_id",
valueColumnName = "test_count")
private Long id;
2020-02-21