hibernate中复合主键

来源:互联网 发布:快速备案淘宝交易 编辑:程序博客网 时间:2024/05/05 11:35

复合主键:一张表的多个字段组合构成这张表的主键,这个主键就叫复合主键。

在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();

}

 

原创粉丝点击