在日常开发中,有时候会出现要求两个或以上字段联合做主键的表,就两个字段做主键为例,用户表的联合主键为firstname和lastname,商品表的联合主键为id和pid等等。而在hibernate中,也提供了composite-id节点,对复合主键进行支持和定义。
为了说的更加详细,我们这里先新建一个T_User表,其中的firstname和lastname为该表的联合主键:
- CREATE TABLE T_User (
- FIRSTNAME varchar2(10) ,
- LASTNAME varchar2(4),
- AGE NUMBER(2),
- CONSTRAINT PK_TAB PRIMARY KEY (FIRSTNAME,LASTNAME) -- l设置联合主键
- );
那么基于该表的hibernate的映射文件为:<hibername-mapping>
- <class name="com.entity.TUser" table="T_user">
- <composite-id>
- <key-property name="lastname" column="lastname" type="string"/>
- <key-property name="firstname" column="firstname" type="string"/>
- </composite-id>
- <property column="age" name="age" type="integer"/>
- </class>
- /hibernate-mapping>
hibernate要求复合主键类实现equal和hashcode方法,以作为不同数据之间的识别标志,那么Tuser.java的代码则应该如下:public class Tuser implement Serializable{
- private Integer age;
- private String firstname;
- private String lastname;
- //getter and setter略
- public boolean equals(Object obj){
- if(!(obj instanceof Tuser)){
- return false;
- }
- Tuser tuser=(Tuser)obj;
- return new EqualsBuilder().appendSuper(super.equals(obj)).append(this.lastname,tuser.lastname).append(this.firstname,tuser.firstname).isEquals();
- }
- public int hashCode(){
- return new HashCodeBuilder(-528253723, -475504089).appendSuper(super.hashCode()).append(this.lastname).append(this.firstname).toHashCode();
- }
- }
上述的EqualBuilder和HashCodeBuilder均为apache commons lang组件包中的工具类。Tuser中包含了复合组件数据,本身也是“主键类”的角色,即实体标志(id),因此,对于Session.load()方法而言,我们可以将Tuser类对象本身作为查询条件(Serialzable id)进行检索:
- Tuser uesr=new Tuser();
- user.setFirstname("Cat");
- user.setLastname("Dog");
- //以user为标志识别对象,通过load方法加载
- user=(Tuser).session.load(Tuser.class,user);
- syso("User age is "+uesr.getAge());
关于引入的新节点composite-id,该节点的具体内容为:
- <composite-id
- name="propertyName"
- class="ClassName"
- mapped="true|false"
- access="field|property|ClassName"
- node="element-name|."
- >
- <key-property name="propertyName" type="typename" column="column_name"/>
- <key-many-to-one name="propertyName class="ClassName" column="column_name"/>
- ......
- </composite-id>