Hibernate學習筆記(三)----ID生成策略、聯合主鍵
一、ID生成策略(參考hibernate_0400_ID)
1)xml生成id使用generator屬性
<idname="id" >
<generatorclass="native"></generator>
</id>
常用四個:native identitysequence uuid
2)註解方式:@GeneratedValue
a) 自定義ID
b) AUTO(直接寫@GeneratedValue 相當如native) (@GeneratedValue(strategy=GenerationType.
i. 預設:對 MySQL,使用auto_increment
ii. 對 Oracle使用hibernate_sequence(名稱固定)
c) IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))
d) SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))
i. @SequenceGenerator(可自定義在
@Id
//在@GeneratedValue中增加generator="teacherSEQ"
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
public int getId() {
returnid;
}
//"teacherSEQ"為@SequenceGenerator的標識名
//"teacherSEQ_DB"為指定到資料庫生成的Sequence名
@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
e) TABLE (可以忘記)
i. @TableGenerator
@TableGenerator(
name="teacherID", //被呼叫的TABLE名字
table="teacherID_DB", //資料庫建立的表名
pkColumnName="key_value",
pkColumnValue="pk_value",
valueColumnName="teacher", //pkColumnValue對應類名
allocationSize=1 //pkColumnValue對應類名
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="teacherID ")
注:如果使用註解方式的uuid如下:
@Id
@GeneratedValue(generator="teacherUUID")
@GenericGenerator(name="teacherUUID",strategy="uuid")
二、聯合主鍵
a) Xml方式: composite-id
i. 將聯合主鍵的屬性提取出來,重新編寫一個pojo類(原pojo類中的id,name要刪除並新加入屬性“StudentPK”)
public class StudentPK implements Serializable {
privateString id;
privateString name;
… …
ii. 新建pojo類必須實現 Java.io.Serializable序列化接口
iii. 新pojo類要重寫equals和hashCode方法
@Override
public boolean equals(Object o) {
if(oinstanceof StudentPk) {
StudentPkpk = (StudentPk)o;
if(this.id== pk.getId() && this.name.equals(pk.getName())) {
return true;
}
}
returnfalse;
}
@Override
public int hashCode() {
returnthis.name.hashCode();
}
iv. 聯合主鍵生成策略XML配置方法
<classname="com.bjsxt.pojo.Student" >
<composite-idname="studentPK" class="com.bjsxt.pojo.StudentPK">
<key-propertyname="id"></key-property>
<key-propertyname="name"></key-property>
</composite-id>
<propertyname="age" />
<propertyname="sex" />
<propertyname="good" type="yes_no"></property>
</class>
</hibernate-mapping>
b) Annotation
i. 前三步與Xml方式前三步一樣 都要建立新pojo類 都要實現Serializable介面 重寫equals和hashCode方法.
ii. 方法1在新類前寫@Embeddable,在原pojo類的新屬性“TercherPK”的get方法前寫@ld,如下
@ Embeddable
public class TeacherPK implements Serializable {
privateString id;
privateString name;
… …
@Entity
public classTeacher {
privateTeacherPK teacherPK ;
@Id
publicTeacherPK getTeacherPK() {
returnteacherPK;
}
… …
iii. 方法2:@EmbeddedlD(*) 新pojo類無需加註解,只需在原pojo類新屬性“TercherPK”的get方法前寫@EmbeddedlD即可
iv. 方法3:@Id @IdClass(*) 新pojo類無需加註解,原pojo類的id,name屬性保留不變,也無需新增“TercherPK”屬性。 只在id,name的get方法前都加@Id,並在原pojo類前加“@IdClass(TeacherPK).class)”,如下
@Entity
@IdClass(TeacherPK.class)
public class Teacher {
private String id;
private String name;
@Id
public String getId() {
return id;
}
@Id
public String getName() {
return name;
}