Hibernate 使用復合主鍵

jopen 11年前發布 | 21K 次閱讀 Hibernate 持久層框架

在數據庫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
 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!