Hibernate多表關係配置——一對一關係映射

兩個對象之間是一對一的關係,如Person-IdCard數據庫

有兩種策略能夠實現一對一的關聯映射session

主鍵關聯:即讓兩個對象具備相同的主鍵值,以代表它們之間的一一對應的關係;數據庫表不會有額外的字段來維護它們之間的關係,僅經過表的主鍵來關聯 惟一外鍵關聯app

外鍵關聯,原本是用於多對一的配置,可是若是加上惟一的限制以後,也能夠用來表示一對一關聯關係;ide

一、實體對象測試

1.1 Person實體對象ui

package demo.entity;
/**
 * 人實體
 * @author Don
 * @date:日期:2017年4月11日 時間:上午11:04:59*
 * @version 1.0
 */
public class Person {
    private String id;
    private String name;
    //一對一關係的實體表現
    private IdCard card;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public IdCard getCard() {
        return card;
    }
    public void setCard(IdCard card) {
        this.card = card;
    }
}
View Code

1.2 IdCard實體對象this

package demo.entity;
/**
 * 身份證明體
 * @author Don
 * @date:日期:2017年4月11日 時間:上午11:05:53*
 * @version 1.0
 */
public class IdCard {
    private String id;
    private String code;
    //一對一關係的實體表現
    private Person person;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String card) {
        this.code = card;
    }
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }
    
}
View Code

二、一對一關係映射(主鍵關聯)spa

2.1 Person對象映射配置.net

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 -->
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Person" table="o2o_person">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator類來生成主鍵 -->
            <generator class="uuid" />
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name"  />
        
        <one-to-one name="card" class="demo.entity.IdCard" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

2.2 IdCard對象映射配置hibernate

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.IdCard" table="02o_card">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 主鍵關聯,經過Person的主鍵生成IdCard的主鍵-->
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="code" />
        
        <one-to-one name="person" class="demo.entity.Person" cascade="all"></one-to-one>

    </class>
</hibernate-mapping>

三、一對一關係映射(惟一外鍵)

3.1 Person對象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 在這個一對一的關係中,Person能夠本身產生主鍵值 -->
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.Person" table="o2o_person_forengn">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- Hibernate使用generator類來生成主鍵 -->
            <generator class="uuid" />
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name"  />
        
        <!-- card中使用person描述Person對象 -->
        <one-to-one name="card" property-ref="person" cascade="all"></one-to-one>
    </class>
</hibernate-mapping>

 

3.2 IdCard對象映射配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name:實體, table:表名 -->
    <class name="demo.entity.IdCard" table="02o_card_forergn">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 生成主鍵-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="code" />
        
        <!-- IdCard添加外鍵,IdCard和Person具備多對一的關係,實現一對一,則限制unique爲true -->
        <many-to-one name="person" column="personId" unique="true" cascade="all"></many-to-one>
    </class>
</hibernate-mapping>

 

四、測試保存

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.IdCard;
import demo.entity.Person;
import demo.util.HibernateUtil;

public class TestSave {

    public static void main(String[] args) {
        
        Session session =  HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        Person person = new Person();
        person.setName("張三");
        
        //身份證的主鍵Id依賴於Perrson,所以須要添加Person
        IdCard card = new IdCard();
        card.setCode("110");
        
        /*
         * 保存方式一
         * 
        card.setPerson(person);
        person.setCard(card);        
        session.save(person);
        */
        //方式二(IdCard是關係的維護方)
        card.setPerson(person);
        session.save(card);
        
        session.getTransaction().commit();
    }

}
View Code
相關文章
相關標籤/搜索