1. 程式人生 > >@GeneratorValue與@GenericGenerator註解使用心得

@GeneratorValue與@GenericGenerator註解使用心得

映射關系 blog oracle數據 -s 根據 select 序列 signed repr

http://blog.csdn.net/tianxiezuomaikong/article/details/64930151

、、、、、、、、、、、

什麽是JAP?
JPA全稱Java Persistence API,其通過JDK 5.0(或以上版本)的註解或XML配置方式來描述 對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。

JPA與Hibernate的關系是怎樣的?
JPA的總體思想和現有的Hibernate、TopLink、JDO等,這些ORM框架大體一致。
個人淺顯的理解為,JPA給後面那些ORM開發廠商提供了一些“標準”,使得它們可以在現有的一些模板上進行互相補充,而最後開發出來的ORM產品,主要方面還是在實體對象與數據庫的持久化,以及對數據庫的一些CRUD操作上。

好,下面我們來看看今天正式的內容。

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


(附圖片所示頁面的鏈接:
http://docs.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html )

好的,我們繼續往下了解,GenerationType中有什麽樣的值供我們選擇,這些值分別又代表了什麽意思。
技術分享


由上圖我們發現,GenerationType同樣也位於javax.persistence包下,並且還繼承了Enum枚舉類,然後其中有4個值供我們使用,分別是:
TABLE:使用一個特定的數據庫表格來保存主鍵。
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。
IDENTITY:主鍵由數據庫自動生成(主要是支持自動增長的數據庫,如mysql)
AUTO:主鍵由程序控制,也是GenerationType的默認值。

下面貼出一些使用的範例。(我比較喜歡把註解放在getter方法的上面)

GenerationType.TABLE

@Id  
@GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")  
@TableGenerator(name = "pk_gen", table="tb_generator",
    pkColumnName="gen_name",  valueColumnName="gen_value",  
    pkColumnValue="PAYABLEMOENY_PK", allocationSize=1)  
public long getUserId() {
        return userId;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

GenerationType.SEQUENCE

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
public long getUserId() {
        return userId;
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

GenerationType.IDENTITY

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public long getUserId() {
        return userId;
} 
  • 1
  • 2
  • 3
  • 4
  • 5

GenerationType.AUTO

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long getUserId() {
        return userId;
} 
  • 1
  • 2
  • 3
  • 4
  • 5

四種數據庫的對GeneratorValue4種策略的支持情況如下:

mysql
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
不支持GenerationType.SEQUENCE

oracle
strategy=GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE
不支持GenerationType.IDENTITY

postgreSQL
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
GenerationType.SEQUENCE
都支持

kingbase
GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO
都支持


@GenericGenerator註解

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

@GenericGenerator支持13種策略,分別是:

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);  

} 

上面的12種策略,再加上native,一共是13種。
其實,這就是hibernate對JPA策略的一種拓展補充。
我個人用的比較多的是uuid策略,用在了oracle數據庫的主鍵生成上,她會根據內部程序計算出32位長度的唯一id,具體使用範例如下:

@GeneratedValue(generator = "paymentableGenerator") 
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
public String getUserId() {
        return userId;
}

其他我就先不一一補充了,下面推薦兩篇好文,裏面說的很詳細,很多迷惑的點我也參考了它們才解答出來,附上博文鏈接:

http://www.cnblogs.com/tobeprogramer/p/4162228.html

http://www.cnblogs.com/ph123/p/5692194.html

@GeneratorValue與@GenericGenerator註解使用心得