最常用:native 由不同DB生成不同的策略
其次:identity、sequence
一些用:uuid
------------------------------------------
XML配置:
Annotation:
@Id
@GeneratedValue //默认auto相当于native
public int getId()
{
return 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
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
//主键生成策略,默认auto相当于native
public int getId() {
return
id;
}
//省略其他........
}
------------------------------------------
不常用
@TableGenerator(
name="Teacher_GEN", //给自己起个名字
table="GENRTATOR_TABLE", //新建一张表用来保存主键生成策略,表名叫:GENRTATOR_TABLE
pkColumnName="key", //主键列叫key
valueColumnName="value", //值列叫value
pkColumnValue="Teacher", //主键列的一个数据,叫Teacher
allocationSize=1 //递增量
)
它写在class前
使用它生成主键策略时,还需设置@GeneratedValue(strategy=GenerationType.TABLE)
使用它可以跨DB平台、针对不同DB生成不同主键标识
------------------------------------------
联合主键:
首先修改javaBean,创建一个主键类,里面包含主键字段属性
还需实现java.io.Serialize接口和重写equals和hashCode方法
@Override
public boolean equals(Object o){
if(o instanceof TeacherPK){
TeacherPK pk = (TeacherPK)o;
if(this.id == pk.getId() &&
this.name.equals(pk.getName())){
return true;
}
}
return false;
}
@Override
public int hashCode(){
return this.name.hashCode();
}
在该javaBean中使用主键类做属性
private TeacherPK pk;
public TeacherPK getTeacherPK(){
return pk;
}
修改XML映射文件配置:
将标签换成标签
配置了联合主键为: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(){
return pk;
}
3.将javaBean类注解@IdClass并将该实体中所有属于主键的属性注解为@Id
@IdClass
public class Teacher{
private int id;
private String name;
@Id
public int getId(){}
@Id
public String getName(){}
}
------------------------------------------