首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

hibernate id 联结主键生成策略

2013-02-27 
hibernate id 联合主键生成策略如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时

hibernate id 联合主键生成策略
如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用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" />             <key-property name="firstName" />         </composite-id>         <property name="age" column="age" />         <property name="sex" length="2" />         <property name="job" length="50" />     </class></hibernate-mapping>




在使用annotation的时候,有三种方法来实现联合组建:
1.将组件类注解为@Embeddable,并将组件的属性注解为@Id
package com.seed.lee.model;/** * 这个类作为Person类的(组合主键)主键类 * * @author Administrator * */ @Embeddablepublic 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();     }}


package com.seed.lee.model;public class Person {    PersonUionPKID uionPKID = new PersonUionPKID();    private int age;    private String sex;    private String job;     @Id    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;     }}


2. 将组件的属性注解为@EmbeddedId

package com.seed.lee.model;public class Person {    PersonUionPKID uionPKID = new PersonUionPKID();    private int age;    private String sex;    private String job;    @EmbeddedId    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.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id
package com.seed.lee.model;@@IdClass(PersonUionPKID.class)public class Person {    private String firstName;    private String secondName;    private int age;    private String sex;    private String job;   @Id    public String getFirstName() {         return firstName;     }    public void setFirstName(String firstName) {         this.firstName = firstName;     }        @Id    public String getSecondName() {         return secondName;     }    public void setSecondName(String secondName) {         this.secondName = secondName;     }    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;     }}

热点排行