Hibernate 使用复合主键

jopen 11年前

在数据库ssh下建立一个表dog

create table dog(  id int(11) not null,  dog_id int(11) not null,  name varchar(20) default null,  primary key(id,dog_id)  )engine=innodb default charset=gbk;

建立一个主键类DogId.java

package helloworld.compositeid;    public class DogId implements java.io.Serializable {     // Fields     private Integer id;   private Integer dogId;     // Constructors     /** default constructor */   public DogId() {   }     /** full constructor */   public DogId(Integer id, Integer dogId) {    this.id = id;    this.dogId = dogId;   }     // Property accessors     public Integer getId() {    return this.id;   }     public void setId(Integer id) {    this.id = id;   }     public Integer getDogId() {    return this.dogId;   }     public void setDogId(Integer dogId) {    this.dogId = dogId;   }     public boolean equals(Object other) {    if ((this == other))     return true;    if ((other == null))     return false;    if (!(other instanceof DogId))     return false;    DogId castOther = (DogId) other;      return ((this.getId() == castOther.getId()) || (this.getId() != null      && castOther.getId() != null && this.getId().equals(      castOther.getId())))      && ((this.getDogId() == castOther.getDogId()) || (this        .getDogId() != null        && castOther.getDogId() != null && this.getDogId()        .equals(castOther.getDogId())));   }     public int hashCode() {    int result = 17;      result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());    result = 37 * result      + (getDogId() == null ? 0 : this.getDogId().hashCode());    return result;   }    }

建立一个类Dog.java

package helloworld.compositeid;    public class Dog implements java.io.Serializable {   private DogId id;   private String name;   private String color;     public Dog() {   }     public Dog(DogId id) {    this.id = id;   }     public Dog(DogId id, String name, String color) {    this.id = id;    this.name = name;    this.color = color;   }       public DogId getId() {    return this.id;   }     public void setId(DogId id) {    this.id = id;   }     public String getName() {    return this.name;   }     public void setName(String name) {    this.name = name;   }     public String getColor() {    return this.color;   }     public void setColor(String color) {    this.color = color;   }    }

建立映射文件Dog.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    <hibernate-mapping>   <class name="helloworld.compositeid.Dog" table="dog" catalog="ssh">    <!--定义复合主键-->    <composite-id name="id" class="helloworld.compositeid.DogId">     <key-property name="id" type="java.lang.Integer">      <column name="id" />     </key-property>     <key-property name="dogId" type="java.lang.Integer">      <column name="dog_id" />     </key-property>    </composite-id>    <property name="name" type="java.lang.String">     <column name="name" length="20" />    </property>    <property name="color" type="java.lang.String">     <column name="color" length="10" />    </property>   </class>  </hibernate-mapping>

编写一个测试类,实现基本CRUD操作,Test.java

package helloworld.compositeid;    import org.hibernate.Session;  import org.hibernate.SessionFactory;  import org.hibernate.Transaction;  import org.hibernate.cfg.Configuration;    public class Test {     /**    * @param args    */   public static void main(String[] args) {    // Configuration管理Hibernate配置    Configuration config = new Configuration().configure();    // 根据Configuration建立 SessionFactory    // SessionFactory用来建立Session    SessionFactory sessionFactory = config.buildSessionFactory();      // 增加记录    // 建立主键类实例    DogId dogid = new DogId();    dogid.setId(1);    dogid.setDogId(1);    // 建立Dog对象    Dog dog = new Dog();    dog.setName("Tom");    dog.setColor("yellow");    dog.setId(dogid);      Session session = sessionFactory.openSession();    Transaction tx = null;    try {     tx = session.beginTransaction();     session.save(dog);     tx.commit();    } catch (RuntimeException e) {     if (tx != null)      tx.rollback();     throw e;    } finally {     session.close();    }      // 查找数据    session = sessionFactory.openSession();    dog = (Dog) session.get(Dog.class, dogid);    System.out.println(dog.getId().getId() + " " + dog.getId().getDogId()      + " " + dog.getName());    session.close();      // 修改数据    dog.setName("Kitty");    session = sessionFactory.openSession();    tx = null;    try {     tx = session.beginTransaction();     session.update(dog);     tx.commit();    } catch (RuntimeException e) {     if (tx != null)      tx.rollback();     throw e;    } finally {     session.close();    }      // 删除数据    session = sessionFactory.openSession();    tx = null;    try {     tx = session.beginTransaction();     session.delete(dog);     tx.commit();    } catch (RuntimeException e) {     if (tx != null)      tx.rollback();     throw e;    } finally {     session.close();    }      // 关闭sessionFactory    sessionFactory.close();     }    }


源程序解读:

1.本实例使用了单独的主键类DogId。

2.主键类DogId重写了equals方法和hashCode方法,这一点非常重要。

3.Hibernate要求主键类必须实现Serializable接口。

4.复合主键的值是一个主键类,而不是一个普通的常见数值。

5.复合主键的映射文件使用composite-id表示。


来自:http://blog.csdn.net/itzyjr/article/details/8487675