Spring Data JPA 主鍵生成策略注解


在寫項目時為數據庫主鍵為varChar的主鍵配置時發現@GeneratedValue這個注解的配置完成不了MySQL數據庫主鍵的序列化生成策略,所以去看了看這方便的資料發現還說的挺多的.

@GeneratedValue注解:

屬於一個JPA接口(從JAVA EE 5開始,存在於javax.persistence包下),其接口下包含了兩個抽象的參數,GenerationType類型的strategy和String類型的generator,並且兩個參數都有相應的默認值。

其中stratgy屬性的默認值有:

GenerationType是一個enum類

  • GeneratorType strategy

strategyGenerationType類型的枚舉值,它的內容將指定 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM