@GeneratorValue與@GenericGenerator註解使用心得
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註解使用心得