在寫項目時為數據庫主鍵為varChar的主鍵配置時發現@GeneratedValue這個注解的配置完成不了MySQL數據庫主鍵的序列化生成策略,所以去看了看這方便的資料發現還說的挺多的.
@GeneratedValue注解:
屬於一個JPA接口(從JAVA EE 5開始,存在於javax.persistence包下),其接口下包含了兩個抽象的參數,GenerationType類型的strategy和String類型的generator,並且兩個參數都有相應的默認值。
其中stratgy屬性的默認值有:
GenerationType是一個enum類
GeneratorType strategy
strategy
是 GenerationType
類型的枚舉值,它的內容將指定 OpenJPA 容器自動生成實體標識的方式。strategy
屬性可以是下列枚舉值:
GeneratorType.AUTO
表示實體標識由 OpenJPA 容器自動生成,這也是 Strategy 屬性的默認值。
GenerationType.IDENTITY
OpenJPA 容器將使用數據庫的自增長字段為新增加的實體對象賦唯一值,作為實體的標識。這種情況下需要數據庫提供對自增長字段的支持,常用的數據庫中,HSQL、SQL Server、MySQL、DB2、Derby 等數據庫都能夠提供這種支持。
GenerationType.SEQUENCE
表示使用數據庫的序列號為新增加的實體對象賦唯一值,作為實體的標識。這種情況下需要數據庫提供對序列號的支持,常用的數據庫中,Oracle、PostgreSQL 等數據庫都能夠提供這種支持。
GenerationType.TABLE
表示使用數據庫中指定表的某個字段記錄實體對象的標識,通過該字段的增長為新增加的實體對象賦唯一值,作為實體的標識。
格式:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
/** 類目id */
private Integer categoryId;
generator屬性:
String generator
generator
屬性中定義實體標識生成器的名稱。如果實體的標識自動生成策略不是GenerationType.AUTO
或者GenerationType.IDENTITY
,就需要提供相應的 @SequenceGenerator
或者 @TableGenerator
注釋還有@GenericGenerator注解,然后將generator
屬性值設置為注釋的name
屬性值。-
@javax.persistence.SequenceGenerator
如果實體標識的自動生策略是
GenerationType.SEQUENCE
,開發者需要為實體標識字段提供SequenceGenerator
注釋,它的參數描述了使用序列號生成實體標識的具體細節。該注釋支持以下四個屬性:
表 1. SequenceGenerator 注釋屬性說明屬性 說明 name
該屬性是必須設置的屬性,它表示了 SequenceGenerator
注釋在 OpenJPA 容器中的唯一名稱,將會被GeneratedValue
注釋的generator
屬性使用。將實體標識的自動生成委托給數據庫的序列號特性時,實體標識字段的GeneratedValue
注釋的generator
屬性的值必須和某個SequenceGenerator
注釋的name
屬性值保持一致。sequenceName
實體標識所使用的數據庫序列號的名稱。該屬性是可選的,如果我們沒有為該屬性設置值,OpenJPA 框架將自動創建名為 OPENJPA_SEQUENCE
的序列號。如果一個 OpenJPA 容器中管理的多個實體都選擇使用序列號機制生成實體標識,而且實體類中都沒有指定標識字段的sequenceName
屬性,那么這些實體將會共享系統提供的默認名為OPENJPA_SEQUENCE
的序列號。這可能引起實體類編號的不連續。我們可以用下面的這個簡單例子說明這種情況:假設 OpenJPA 容器中存在兩個實體類 Dog 和 Fish,它們的實體標識字段都是數值型,並且都選擇使用序列號生成實體標識,但是實體類中並沒有提供sequenceName
屬性值。當我們首先持久化一個 Dog 對象時,它的實體標識將會是 1,緊接着我們持久化一個 Fish 對象,它的實體標識就是 2,依次類推。initialValue
該屬性設置所使用序列號的起始值。 allocationSize
一些數據庫的序列化機制允許預先分配序列號,比如 Oracle,這種預先分配機制可以一次性生成多個序列號,然后放在 cache 中,數據庫用戶獲取的序列號是從序列號 cache 中獲取的,這樣就避免了在每一次數據庫用戶獲取序列號的時候都要重新生成序列號。 allocationSize
屬性設置的就是一次預先分配序列號的數目,默認情況下allocationSize
屬性的值是 50。@javax.persistence.TableGenerator
如果實體標識的自動生策略是 GenerationType.TABLE,開發者需要為實體標識字段提供 TableGenerator 注釋,它的參數描述了使用數據庫表生成實體標識的具體細節。該注釋支持下列屬性:
表 2. 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 容器將會使用默認值 ID
。valueColumnName
該屬性設置的是生成序列號的表中記錄實體對應標識最大值的字段的名稱。該屬性並不是必須設置的屬性,如果開發者沒有為該 屬性設置值,OpenJPA 容器將會使用默認值 SEQUENCE_VALUE
。pkColumnValue
該屬性設置的是生成序列號的表中的主鍵字段的特征字符串值 ( 比如 customID ),該字段將保存代表每個實體對應的標識值對應的特征字符串。該屬性並不是必須設置的屬性,如果開發者沒有為該屬性設置值,OpenJPA 容器將會使用默認值 DEFAULT
。可以為多個實體設置相同的pkColumnValue
屬性值,這些實體標識的生成將通過同一列的值的遞增來實現。initialValue
該屬性設置的是生成序列號的表實體標識的初始值。該屬性並不是必須設置的屬性,如果開發者沒有為該屬性設置值,OpenJPA 容器將會使用默認值 0 。 allocationSize
為了降低標識生成時頻繁操作數據庫造成 的性能上的影響,實體標識生成的時候會一次性的獲取多個實體標識,該屬性設置的就是一次性獲取實體標識的數目。該屬性並不是必須設置的屬性,如果開發者沒有為該屬性設置值,OpenJPA 容器將會使用默認值 50 。
@org.hibernate.annotations.GenericGenerator
@GenericGenerator注解是hibernate所提供的自定義主鍵生成策略生成器,由@GenericGenerator實現多定義的策略。所以,它要配合@GeneratedValue一起使用,並且@GeneratedValue注解中的”generator”屬性要與@GenericGenerator注解中name屬性一致,strategy屬性表示hibernate的主鍵生成策略.
@GenericGenerator支持13種策略,分別是(strategy屬性取值):
static {
GENERATORS.put("uuid", UUIDHexGenerator.class);
GENERATORS.put("hilo", TableHiLoGenerator.class);
GENERATORS.put("assigned", Assigned.class);
GENERATORS.put("identity", IdentityGenerator.class);
GENERATORS.put("select", SelectGenerator.class);
GENERATORS.put("sequence", SequenceGenerator.class);
GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
GENERATORS.put("increment", IncrementGenerator.class);
GENERATORS.put("foreign", ForeignGenerator.class);
GENERATORS.put("guid", GUIDGenerator.class);
GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
}
格式: (下面代碼是使用系統時間生成uuid)
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid",strategy = "uuid")
/** 訂單id */
private String orderId;
相關知識博客:
LINK: http://www.cnblogs.com/tobeprogramer/p/4162228.html
LINK: http://www.cnblogs.com/ph123/p/5692194.html