为了说的更加详细,我们这里先新建一个T_User表,其中的firstname和lastname为该表的联合主键:
Sql代码
CREATE TABLE T_User (
FIRSTNAME varchar2(10) ,
LASTNAME varchar2(4),
AGE NUMBER(2),
CONSTRAINT PK_TAB PRIMARY KEY (FIRSTNAME,LASTNAME) -- l设置联合主键
);
那么基于该表的hibernate的映射文件为:
Xml代码
/hibernate-mapping>
hibernate要求复合主键类实现equal和hashcode方法,以作为不同数据之间的识别标志,那么Tuser.java的代码则应该如下:public class Tuser implement Serializable{
Java代码
private Integer age;
private String firstname;
private String lastname;
//getter and setter略
public boolean equals(Object obj){
if(!(obj instanceof Tuser)){
return false;
}
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)进行检索:
Java代码
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,该节点的具体内容为:
Java代码
class="ClassName"
mapped="true|false"
access="field|property|ClassName"
node="element-name|."
>
......
其中包含了key-many-to-one的节点,它是用于实现多对一关联,当然我们这里没有涉及到,如果大家感兴趣,可以自己去查阅下相关的资料。