天天看點

hibernate筆記--基于主鍵的單(雙)向的一對一映射關系

  上一節介紹的基于外鍵的一對一映射關系中,在Person表中有一個外鍵列idCard_id,對應的idCard表的主鍵id,至于基于主鍵的一對一映射關系,就是指Person表中抛棄了idcard_id這個外鍵列,而與idCard表共用一個主鍵,或者說是其外鍵為主鍵的表結構,這種基于主鍵的雙向一對一映射關系應該這樣配置:

建立一個IdCard實體類:

public class IdCard {

    private int id;
    private String code;
    private Person person;
    //get/set方法省略
}      

建立一個Person實體類:

public class Person {

    private int id;
    private String name;
    private int age;
    private IdCard idCard;
        //get/set方法省略
}      

在目前包下建立IdCard類的映射檔案IdCard.hbm.xml:

<?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.wang.pojo">
    <class name="IdCard" >
    <id    name="id">
        <generator class="native"></generator>
    </id>
    
    <property name="code"></property>
    <!-- 隻需要添加此标簽就可以 -->
    <one-to-one name="person"></one-to-one>
    </class>
</hibernate-mapping>      

在目前包下建立Person類的映射檔案Person.hbm.xml:

<?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.wang.pojo">
    <class name="Person" >
    <id    name="id">
    <!-- foreign表示引用外鍵 -->
        <generator class="foreign">
        <!-- 引用idCard表中所對應的主鍵 -->
            <param name="property">idCard</param>
        </generator>
    </id>
    
    <property name="name"></property>
    <property name="age"></property>
    <!-- constrained="true" 表示設定主鍵限制為true -->
    <one-to-one name="idCard" constrained="true" cascade="save-update"></one-to-one>
    </class>
</hibernate-mapping>      

将兩個映射檔案添加到hibernate.cfg.xml中;建立測試類,測試:1,自動生成表2:儲存資料3:讀取資料:

  @Test
    public void testCreateDB() {
        Configuration cfg = new Configuration().configure();
        SchemaExport se = new SchemaExport(cfg);
        // 第一個參數是否生成ddl腳本 第二個參數是否執行到資料庫
        se.create(true, true);
    }

    @Test
    public void testSave() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        // Score s=new Score(2,12,97);
        // session.save(s);
        IdCard id1=new IdCard();
        id1.setCode("3713251882923783494");
        IdCard id2=new IdCard();
        id2.setCode("3713251882925378612");
        Person p1=new Person();
        p1.setName("李雲龍");
        p1.setAge(41);
        p1.setIdCard(id1);
        Person p2=new Person();
        p2.setName("楚雲飛");
        p2.setAge(34);
        p2.setIdCard(id2);
        
        
        session.save(p1);
        session.save(p2);
        //session.save(p3);
        
        tx.commit();
        session.close();
    }
    
    @Test
    public void testGet() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Person p=(Person)session.get(Person.class, 1);
        System.out.println("name="+p.getName()+"===idcard="+p.getIdCard().getCode());
        IdCard id=(IdCard)session.get(IdCard.class, 1);
        System.out.println("name="+id.getPerson().getName()+"==idcard="+id.getCode());
        tx.commit();
        session.close();
    }      

以上是基于主鍵的雙向一對一映射關系,如果隻需要設定單向一對一映射,假如隻需要通過Person類能擷取到IdCard類的資訊就可以,不需要通過IdCard來擷取Person中的資訊,隻要把Idcard類中private Perosn person;以及對應get/set方法去掉,然後将IdCard.hbm.xml中的 <one-to-one name="person"></one-to-one>标簽去掉即可.其他地方不需要改變.