hibernate联合主键

在日常开发中,有时候会出现要求两个或以上字段联合做主键的表,就两个字段做主键为例,用户表的联合主键为firstname和lastname,商品表的联合主键为id和pid等等。而在hibernate中,也提供了composite-id节点,对复合主键进行支持和定义。

为了说的更加详细,我们这里先新建一个T_User表,其中的firstname和lastname为该表的联合主键:

Sql代码
  1. CREATETABLET_User(
  2. FIRSTNAMEvarchar2(10),
  3. LASTNAMEvarchar2(4),
  4. AGENUMBER(2),
  5. CONSTRAINTPK_TABPRIMARYKEY(FIRSTNAME,LASTNAME)--l设置联合主键
  6. );

那么基于该表的hibernate的映射文件为:<hibername-mapping>

Xml代码
  1. <classname="com.entity.TUser"table="T_user">
  2. <composite-id>
  3. <key-propertyname="lastname"column="lastname"type="string"/>
  4. <key-propertyname="firstname"column="firstname"type="string"/>
  5. </composite-id>
  6. <propertycolumn="age"name="age"type="integer"/>
  7. </class>
  8. /hibernate-mapping>

hibernate要求复合主键类实现equal和hashcode方法,以作为不同数据之间的识别标志,那么Tuser.java的代码则应该如下:public class Tuser implement Serializable{

Java代码
  1. privateIntegerage;
  2. privateStringfirstname;
  3. privateStringlastname;
  4. //getterandsetter略
  5. publicbooleanequals(Objectobj){
  6. if(!(objinstanceofTuser)){
  7. returnfalse;
  8. }
  9. Tusertuser=(Tuser)obj;
  10. returnnewEqualsBuilder().appendSuper(super.equals(obj)).append(this.lastname,tuser.lastname).append(this.firstname,tuser.firstname).isEquals();
  11. }
  12. publicinthashCode(){
  13. returnnewHashCodeBuilder(-528253723,-475504089).appendSuper(super.hashCode()).append(this.lastname).append(this.firstname).toHashCode();
  14. }
  15. }

上述的EqualBuilder和HashCodeBuilder均为apache commons lang组件包中的工具类。Tuser中包含了复合组件数据,本身也是“主键类”的角色,即实体标志(id),因此,对于Session.load()方法而言,我们可以将Tuser类对象本身作为查询条件(Serialzable id)进行检索:

Java代码
  1. Tuseruesr=newTuser();
  2. user.setFirstname("Cat");
  3. user.setLastname("Dog");
  4. //以user为标志识别对象,通过load方法加载
  5. user=(Tuser).session.load(Tuser.class,user);
  6. syso("Userageis"+uesr.getAge());

关于引入的新节点composite-id,该节点的具体内容为:

Java代码
  1. <composite-id
  2. name="propertyName"
  3. class="ClassName"
  4. mapped="true|false"
  5. access="field|property|ClassName"
  6. node="element-name|."
  7. >
  8. <key-propertyname="propertyName"type="typename"column="column_name"/>
  9. <key-many-to-onename="propertyNameclass="ClassName"column="column_name"/>
  10. ......
  11. </composite-id>
其中包含了key-many-to-one的节点,它是用于实现多对一关联,当然我们这里没有涉及到,如果大家感兴趣,可以自己去查阅下相关的资料。

你可能感兴趣的:(Hibernate)