复合主键:一张表的多个字段组合构成这张表的主键,这个主键就叫复合主键。
在hibernate中配置复合主键:
Hibernate复合主键的编写有两种情况:
1、将复合主键各字段定义为私有属性。
2、将复合主键字段抽取出来定义一个主键类(暂且这样称呼),在实体类中包含主键类即可。(推荐使用这种方法)
映射文件的编写:
复合主键使用:
方式一:
<composite-id>
<key-property name=”” column=”” type=””/>
<key-property name=”” column=”” type=””/>
</composite-id>
由几个字段构成添加几个<key-property>标签。
name是私有属性名,
column是映射的字段名(可省略,省略后将以私有属性名作为字段名),
type是数据的类型
方式二:
<composite-idname=”” class=””>
<key-property name=”” column=”” type=””/>
<key-property name=”” column=”” type=””/>
</composite-id>
<composite-idname=”” class=””> name是主键类在实体类的私有属性名,class是主键类的类名。
实际操作:
User是实体类,Name是主键类
方式一:
保存的时候:session.save(User.class,user);
方式二:
保存的时候:实体类对象先保存主键类,然后session保存实体类对象。 user.setName(name);,session.save(user);
查询的时候:需要制定主键信息,session.get(实体类对象,主键类对象)。
session.get(user,name);
还有一种说法:
在hibernate中有复合主键的类必须满足两个条件:
1、类必须显现serializable接口。
2、重写equals和hashCode方法。
对于为什么要满足以上的条件,我找了一些资料,原因是hibernate将此作为标识来区分复合主键类和其它实体类。(觉得这样的解释有点牵强,希望有高手解答)
其他的配置和注意细节和上面的说法一样。
equals和hasCode方法的编写。
equal方法
publicboolean equals(Object obj){
if(this==obj){
returntrue;
}
if(!obj.instanceOf(Person)){
return false;
}
returnsuper.equals(obj);
}
hasCode方法
publicint hashCode(){
returnsuper.hashCode();
}