Hibernate 联合主键生成机制 xml

hibernate 联合主键生成机制(组合主键XML配置方式)

如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略。

具体如下:

可以使用一个组件作为一个实体类的标识符。你的组件类必须满足以下要求:

  • 它必须实现 java.io.Serializable 接口

  • 它必须重新实现 equals()hashCode() 方法,始终和组合关键字在数据库中的概念保持一致

    注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的。但最好这样做。

不能使用一个 IdentifierGenerator 产生组合关键字。一个应用程序必须分配它自己的标识符。

具体做法如下步骤:

1.写一个包含表中联合主键的所有字段的类,作为主键类,实例如下:


package com.seed.lee.model;

/**    
* 这个类作为Person类的(组合主键)主键类    
*    
* @author Administrator    
*    
*/    
public class PersonUionPKID implements java.io.Serializable {

private String firstName;

private String secondName;

public String getFirstName() {    
       return firstName;    
   }

public void setFirstName(String firstName) {    
       this.firstName = firstName;    
   }

public String getSecondName() {    
       return secondName;    
   }

public void setSecondName(String secondName) {    
       this.secondName = secondName;    
   }

@Override    
   public boolean equals(Object obj) {    
       if(obj instanceof PersonUionPKID){    
           PersonUionPKID pk=(PersonUionPKID)obj;    
           if(this.firstName.equals(pk.firstName)&&this.secondName.equals(pk.secondName)){    
               return true;    
           }    
       }    
       return false;    
   }

@Override    
   public int hashCode() {    
       return super.hashCode();    
   }

}



这里要特别注意,如hibernate API文档所述,主键类必须实现java.io.Serializable接口,而且推荐用自己的方法override    equals() 和hashCode()方法,保证主键的唯一性.



2.再写一个类与表字段相当的类,这个类里面不一定要包含表主键的所有字段,实例如下:

package com.seed.lee.model;

public class Person {

PersonUionPKID uionPKID = new PersonUionPKID();

private int age;

private String sex;

private String job;

public PersonUionPKID getUionPKID() {    
       return uionPKID;    
   }

public void setUionPKID(PersonUionPKID uionPKID) {    
       this.uionPKID = uionPKID;    
   }

public int getAge() {    
       return age;    
   }

public void setAge(int age) {    
       this.age = age;    
   }

public String getSex() {    
       return sex;    
   }

public void setSex(String sex) {    
       this.sex = sex;    
   }

public String getJob() {    
       return job;    
   }

public void setJob(String job) {    
       this.job = job;    
   }

}



3.配置hibernate配置文件,实例如下:

<?xml version="1.0"?>    
<!DOCTYPE hibernate-mapping PUBLIC    
       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
       "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.seed.lee.model">

<class name="Person" table="person">

<composite-id name="uionPKID" class="com.seed.lee.model.PersonUionPKID">    
           <key-property name="secondName" />    
           <key-property name="firstName" />    
       </composite-id>    
       <property name="age" column="age" />    
       <property name="sex" length="2" />    
       <property name="job" length="50" />    
   </class>

</hibernate-mapping>


4.不要忘记在hibernate配置文件中引用映射文件。

<mapping resource="com/seed/lee/model/Person.hbm.xml" />



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