随笔 - 0, 文章 - 75, 评论 - 0, 引用 - 0
数据加载中……

Annotation与XML配置ID生成策略

最常用:native 由不同DB生成不同的策略


其次:identity、sequence


一些用:uuid


------------------------------------------


XML配置:


<id name="id">


<generator class="策略"></generator>


</id>



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>标签换成<composite-id>标签


<composite-id name="你的javaBean中PK类的引用" class="PK类路径">


<key-property name="id"></key-property>


<key-property name="name"></key-property>


</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(){


return pk;


}


3.将javaBean类注解@IdClass并将该实体中所有属于主键的属性注解为@Id


@IdClass


public class Teacher{


private int id;


private String name;


@Id


public int getId(){}


@Id


public String getName(){}


}



------------------------------------------

posted on 2012-04-22 16:01 hantai 阅读(225) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: