Spring Data JPA主鍵生成策略

@GeneratedValue:設置主鍵的生成策略,依賴於具體的數據庫

屬性 類型 說明
strategy GenerationType 它的內容將指定 OpenJPA 容器自動生成實體標識的方式
說明
GeneratorType.AUTO 表示實體標識由 OpenJPA 容器自動生成,這也是 Strategy 屬性的默認值。
GenerationType.IDENTITY OpenJPA 容器將使用數據庫的自增長字段爲新增加的實體對象賦唯一值,作爲實體的標識。這種情況下需要數據庫提供對自增長字段的支持,常用的數據庫中,HSQL、SQL Server、MySQL、DB2、Derby 等數據庫都能夠提供這種支持
GenerationType.SEQUENCE 表示使用數據庫的序列號爲新增加的實體對象賦唯一值,作爲實體的標識。這種情況下需要數據庫提供對序列號的支持,常用的數據庫中,Oracle、PostgreSQL 等數據庫都能夠提供這種支持。
GenerationType.TABLE 表示使用數據庫中指定表的某個字段記錄實體對象的標識,通過該字段的增長爲新增加的實體對象賦唯一值,作爲實體的標識。
屬性 類型 說明
generator String generator屬性中定義實體標識生成器的名稱。如果實體的標識自動生成策略不是 GenerationType.AUTO或者 GenerationType.IDENTITY,就需要提供相應的 @SequenceGenerator或者 @TableGenerator註釋還有@GenericGenerator註解,然後將 generator屬性值設置爲註釋的 name屬性值

如果實體標識的自動生策略是 GenerationType.SEQUENCE,開發者需要爲實體標識字段提供 SequenceGenerator註釋,它的參數描述了使用序列號生成實體標識的具體細節。SequenceGenerator 註釋屬性說明:

屬性 說明
name 該屬性是必須設置的屬性,它表示了 SequenceGenerator註釋在 OpenJPA 容器中的唯一名稱,將會被 GeneratedValue註釋的 generator屬性使用。將實體標識的自動生成委託給數據庫的序列號特性時,實體標識字段的 GeneratedValue註釋的 generator屬性的值必須和某個 SequenceGenerator註釋的 name屬性值保持一致。
sequenceName 實體標識所使用的數據庫序列號的名稱。該屬性是可選的,如果我們沒有爲該屬性設置值,OpenJPA 框架將自動創建名爲 OPENJPA_SEQUENCE的序列號。如果一個 OpenJPA 容器中管理的多個實體都選擇使用序列號機制生成實體標識,而且實體類中都沒有指定標識字段的 sequenceName屬性,那麼這些實體將會共享系統提供的默認名爲 OPENJPA_SEQUENCE的序列號。這可能引起實體類編號的不連續。
initialValue 該屬性設置所使用序列號的起始值。
allocationSize 一些數據庫的序列化機制允許預先分配序列號,比如 Oracle,這種預先分配機制可以一次性生成多個序列號,然後放在 cache 中,數據庫用戶獲取的序列號是從序列號 cache 中獲取的,這樣就避免了在每一次數據庫用戶獲取序列號的時候都要重新生成序列號。allocationSize屬性設置的就是一次預先分配序列號的數目,默認情況下 allocationSize屬性的值是 50。

如果實體標識的自動生策略是 GenerationType.TABLE,開發者需要爲實體標識字段提供 TableGenerator 註釋,它的參數描述了使用數據庫表生成實體標識的具體細節。

屬性 說明
name 該屬性是必須設置的屬性,它表示了 TableGenerator註釋在 OpenJPA 容器中的唯一名稱,將會被 GeneratedValue註釋的 generator屬性所使用。將實體標識的自動生成委託給數據庫表時,實體標識字段的 GeneratedValue註釋的 generator屬性的值必須和某個 TableGenerator註釋的 name屬性值保持一致。
table 該屬性設置的是生成序列號的表的名稱。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會使用默認的表名 OPENJPA_SEQUENCES_TABLE。
schema 該屬性設置的是生成序列號的表的 schema。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會默認使用當前數據庫用戶對應的 schema。
catalog 該屬性設置的是生成序列號的表的 catalog。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會使用默認當前數據庫用戶對應的 catalog。
pkColumnName 該屬性設置的是生成序列號的表中記錄實體對應標識最大值的字段的名稱。該屬性並不是必須設置的屬性,如果開發者沒有爲該 屬性設置值,OpenJPA 容器將會使用默認值 SEQUENCE_VALUE。
pkColumnValue 該屬性設置的是生成序列號的表中的主鍵字段的特徵字符串值 ( 比如 customID ),該字段將保存代表每個實體對應的標識值對應的特徵字符串。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會使用默認值 DEFAULT。可以爲多個實體設置相同的 pkColumnValue屬性值,這些實體標識的生成將通過同一列的值的遞增來實現。
initialValue 該屬性設置的是生成序列號的表實體標識的初始值。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會使用默認值 0 。。
allocationSize 爲了降低標識生成時頻繁操作數據庫造成 的性能上的影響,實體標識生成的時候會一次性的獲取多個實體標識,該屬性設置的就是一次性獲取實體標識的數目。該屬性並不是必須設置的屬性,如果開發者沒有爲該屬性設置值,OpenJPA 容器將會使用默認值 50 。

@GenericGenerator註解是hibernate所提供的自定義主鍵生成策略生成器,由@GenericGenerator實現多定義的策略。所以,它要配合@GeneratedValue一起使用,並且@GeneratedValue註解中的”generator”屬性要與@GenericGenerator註解中name屬性一致,strategy屬性表示hibernate的主鍵生成策略.

類型 說明
“uuid” UUIDHexGenerator.class
“hilo” TableHiLoGenerator.class
“assigned” Assigned.class
“identity” IdentityGenerator.class
“select” SelectGenerator.class
“sequence” SequenceGenerator.class
“seqhilo” SequenceHiLoGenerator.class
“increment” IncrementGenerator.class
“foreign” ForeignGenerator.class
“guid” GUIDGenerator.class
“uuid.hex” UUIDHexGenerator.class 棄用
“sequence-identity” SequenceIdentityGenerator.class

例子

	//使用UUID爲主鍵
	@Id @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid",strategy = "uuid")

複合主鍵

  • 使用@IdClass
    新建一個主鍵類Key,這個類需要實現 Serializable 接口,並且需要無參構造函數,重寫 equals 和 hashCode 方法
    使用時在實體類上使用**@IdClass(Key.class)**,實體類中的主鍵字段不能少
  • 使用@Embeddable和@EmbeddedId
    新建一個主鍵類Key,這個類需要實現 Serializable 接口,並且需要無參構造函數,重寫 equals 和 hashCode 方法,字段需要用@Column描述
    使用時實體類中主鍵字段類型爲Key,並用@EmbeddedId修飾此字段
Spring Data JPA常用註解: https://blog.csdn.net/lhg1714538808/article/details/105021323.

哪抄的: https://blog.csdn.net/qq_40325734/article/details/81409196.

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