Annotation與XML配置ID生成策略
最常用:native 由不同DB生成不同的策略
其次:identity、sequence
一些用:uuid
------------------------------------------
XML配置:
<id name="id">
</id>
Annotation:
@Id
{
------------------------------------------
指定使用的是哪個序列:
Annotation:
@SequenceGenerator(name="teacherSEQ",sequenceName="DB中的序列名")
name屬性是給自己起個名字,標志自己
sequenceName才是DB中的序列名
注意:在class前面使用!
@SequenceGenerator(name="teacherSEQ",sequenceName="teacher_seq")
public
class Teacher {...}
再配置@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
strategy指生成策略
generator指定前面定義的SequenceGenerator的名字
原理:當Hibernate生成表時,發現策略是sequence,然后發現generator用的是“teacherSEQ”
去找名叫“teacherSEQ”的SequenceGenerator,之后發現用的序列的名字叫sequenceName
生成該sequenceName序列,Teacher表永遠用的是該序列
示例:
@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacher_seq")
public
class Teacher {
private int id;
@Id
//主鍵生成策略,默認auto相當于native
id;
}
------------------------------------------
不常用
@TableGenerator(
//新建一張表用來保存主鍵生成策略,表名叫:GENRTATOR_TABLE
)
它寫在class前
使用它生成主鍵策略時,還需設置@GeneratedValue(strategy=GenerationType.TABLE)
使用它可以跨DB平臺、針對不同DB生成不同主鍵標識
------------------------------------------
聯合主鍵:
首先修改javaBean,創建一個主鍵類,里面包含主鍵字段屬性
還需實現java.io.Serialize接口和重寫equals和hashCode方法
@Override
public boolean equals(Object o){
this.name.equals(pk.getName())){
}
@Override
public int hashCode(){
}
在該javaBean中使用主鍵類做屬性
private TeacherPK pk;
public TeacherPK getTeacherPK(){
}
修改XML映射文件配置:
將<id>標簽換成<composite-id>標簽
<composite-id name="你的javaBean中PK類的引用" class="PK類路徑">
</composite-id>
配置了聯合主鍵為:id、name
解釋:為什么javaBean要實現java.io.Serializable接口?
比如Teacher類對應數據表有多條記錄,在內存中有很多Teacher對象
如果做集群,則需要發送數據、序列化
如果內存滿了,使用虛擬內存,需在硬盤上序列化
為什么重寫equals?
內存中有很多Teacher時,DB以PK區分它們
內存也應有一種邏輯做區分,否則與DB不同步,所以重寫equals
為什么重寫hashCode?
把一系列Teacher對象放到哈希表中,需計算Teacher哈希碼
DB用PK區分,所以用主鍵計算哈希碼
如果想從哈希表中找Teacher對象,先計算出該hashCode的值,然后在與鏈表中的對象比較equals
Annotation定義組合主鍵的3種語法:
1.將組件類(PK)注解為@Embeddable、并將組件的屬性(javaBean中的PK的引用)注解為@Id
2.將組件的屬性注解為@EmbeddedId
@EmbeddedId
public TeacherPK getPk(){
}
3.將javaBean類注解@IdClass并將該實體中所有屬于主鍵的屬性注解為@Id
@IdClass
public class Teacher{
}
------------------------------------------