Hibernate 官方文檔中,主鍵生成政策有十幾種之多,但是在實際開發的過程中,常用的有四種(auto,identity,sequence,select).,其他的政策了解即可,使用到的時候再查也是可以的。
1.政策簡介
auto 讓hibernate自動選擇産生主鍵的方式。hibernate會根據使用的資料庫來判定使用identity或是sequence。
identity 對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置辨別字段提供支援。 傳回的辨別符是long, short 或者int類型的。 sequence 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。傳回的辨別符是long, short或者 int類型的。 select 通過資料庫觸發器選擇一些唯一主鍵的行并傳回主鍵值來配置設定一個主鍵。 這種方式一般建立一張專門生成id的表,然後讓hibernate幫我們管理這張表。這種方式雖然用的并不多,但是可以通過一張表就可以産生N個不同主鍵供系統使用(每一行資料都是一個主鍵)。
2.ID政策執行個體應用(Annotation版本)
2.1auto
在實體類id添加@Id和@GeneratedValue(或是@GeneratedValue(strategy=GenerationType.AUTO)注意如果使用的是mysql的話,就使用identity自動增長的方式來生成主鍵,如果是Oracle的話,hibernate自動生成一個sequence,預設的名字為hibernate_sequence。
package com.founder.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Student {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.2identity 對能夠自動增長的資料庫有效,對MySQL無效。
package com.founder.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Student {
private int id;
private String name;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.3 使用sequence
package com.founder.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
@Entity
@SequenceGenerator(name="s1",sequenceName="h_s_1")
//SequenceGenerator的name是政策名,用來被@GeneratedValue的generator屬性引用
//sequenceName是資料庫側生成的sequence名稱。
public class Student {
private int id;
private String name;
@Id
//generator屬性引用定義@SequenceGenerator定義的name
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="s1")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.4 Select 類型,最複雜,但用的不多。複雜點在于@TableGenerator的配置比較複雜(因為要建立一張表)
package com.founder.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.TableGenerator;
@Entity
@TableGenerator(name="g_t_1",
table="tablegen1",
pkColumnName="GEN_KEY",
valueColumnName="GEN_ID",
pkColumnValue="tg1")
//table表名
//pkColumnName key字段
//valueColumnName value字段
//pkColumnValue本實體類使用的資料,該行資料的特征為GEN_KEY字段等于tg1,GEN_ID 字段就是系統取的id,hibernate取一次将其加1.
public class Student {
private int id;
private String name;
@Id
//generator屬性引用定義@SequenceGenerator定義的name
@GeneratedValue(strategy=GenerationType.TABLE,generator="g_t_1")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
資料庫一側産生了這樣一張表
create table tablegen1 (
GEN_KEY varchar2(255),
GEN_ID number(10,0)
)
3.聯合主鍵。Hibernate聯合主鍵需要生成一個中間類(PK_Class),在真正的實體類中增加該PK_CKass的一個應用即可。