hibernate联合主键

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

 

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

 

Sql代码 
  1. CREATE   TABLE   T_User (   
  2.       FIRSTNAME                                       varchar2(10)      ,   
  3.       LASTNAME                                       varchar2(4),   
  4.       AGE                                      NUMBER(2),   
  5.       CONSTRAINT   PK_TAB  PRIMARY   KEY   (FIRSTNAME,LASTNAME)  -- l设置联合主键  
  6. );  

 

 

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

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

 

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

Java代码 
  1.     private Integer age;  
  2.     private String firstname;  
  3.     private String lastname;  
  4.   
  5.     //getter and setter略  
  6.   
  7.     public boolean equals(Object obj){  
  8.         if(!(obj instanceof Tuser)){  
  9.             return false;  
  10.             }  
  11.         Tuser tuser=(Tuser)obj;  
  12.         return new EqualsBuilder().appendSuper(super.equals(obj)).append(this.lastname,tuser.lastname).append(this.firstname,tuser.firstname).isEquals();  
  13.     }  
  14.   
  15.    public int hashCode(){  
  16.        return new HashCodeBuilder(-528253723, -475504089).appendSuper(super.hashCode()).append(this.lastname).append(this.firstname).toHashCode();  
  17.    }  
  18.   
  19. }  

 

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

 

Java代码 
  1. Tuser uesr=new Tuser();  
  2. user.setFirstname("Cat");  
  3. user.setLastname("Dog");  
  4. //以user为标志识别对象,通过load方法加载  
  5. user=(Tuser).session.load(Tuser.class,user);  
  6. syso("User age is "+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.   
  9.         <key-property name="propertyName" type="typename" column="column_name"/>  
  10.         <key-many-to-one name="propertyName class="ClassName" column="column_name"/>  
  11.         ......  
  12. </composite-id>  
 其中包含了key-many-to-one的节点,它是用于实现多对一关联,当然我们这里没有涉及到,如果大家感兴趣,可以自己去查阅下相关的资料。

你可能感兴趣的:(Hibernate,联合主键)