JPA Hibernate 使用UUID做為主鍵的問題
1.將數據庫中的主鍵,設置為varchar(32)。
2.在entity中類頭部寫入@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
3.在entity中id主鍵頂部寫入@GeneratedValue(generator = "jpa-uuid"),註意generator中的值必須與註釋@GenericGenerator中name屬性完全一致。
4.設置entity中主鍵ID為string類型。設置長度為32
5.GenericGenerator是Hibernate中的註釋,有兩個參數。name是system-uuid“” ,策略strategy是uuid 。
6.@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種。
7.@GeneratedValue註解屬於一個JPA接口(從JAVA EE 5開始,存在於javax.persistence包下),其接口下包含了兩個抽象的參數,GenerationType類型的strategy和String類型的generator,並且兩個參數都有相應的默認值。
8.GenerationType同樣也位於javax.persistence包下,並且還繼承了Enum枚舉類,然後其中有4個值供我們使用,分別是:
TABLE:使用一個特定的數據庫表格來保存主鍵。
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。
IDENTITY:主鍵由數據庫自動生成(主要是支持自動增長的數據庫,如mysql)
AUTO:主鍵由程序控制,也是GenerationType的默認值。
9.兩個數據庫對GenerationType的支持
mysql
GenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
不支持GenerationType.SEQUENCE
oracle
strategy=GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE
不支持GenerationType.IDENTITY
JPA Hibernate 使用UUID做為主鍵的問題