1.知識點概述
<!--格式化顯示的sql語句,好看 -->
<property name="format_sql">true</property>
<!--顯示sql語句 -->
<property name="show_sql">true</property>
關聯關係包括多樣性和方向性的關聯。映射關聯關係就是把物件模型中類之間的關聯關係映射成關聯式模式中資料庫表之間的外鍵參考關聯性。
2. 一對一關聯性
單向一對一:(公民與身份證)
方式一:基於唯一主鍵
Citizen.hbm.xml
<many-to-one name=“idCard” column=“idCard_id”unique=“true” cascade=“all”/>
類似於多對一的關係書寫,最重要的是unique=“true”這句話,來指明關係為一對一。
方式二:基於外鍵
Citizen.hbm.xml:
<id name=“id” column=“id”>
<generator class=“foreign”>
<param name=“property”>idCard</param>
</generator>
</id>
….
<one-to-one name=“idCard” constrained=“true” cascade=“all”/>
基於主鍵的比較繁瑣一些,具體就是以上寫法,某一類的主鍵同時是另一個類的外鍵.constrained=“true”,這個意思是是否顯示參照語句,一般是建立表的時候是否寫出外鍵的參照語句,true為真即寫出.
雙向一對一:(公民與身份證)基於唯一外鍵的一對一關聯其外鍵可以放在任意一端,在需要存放外鍵的一端,使用many-to-one元素,添加unqiue=true;沒有存放外鍵的那一端需要使用one-to-one元素,此時還需要通過property-ref屬性來指定這一端只是關聯另一端,不需要額外的列或外鍵,由hibernate管理這個關係。Citizen.hbm.xml<many-to-one name=“idCard” column=“idCard_id” unique=“true” cascade=“all”/>IDCard.hbm.xml<one-to-one name=“citizen” property-ref=“idCard”/>基於主鍵一端的主鍵使用foreign策略來參照另一端的主鍵來產生。這樣兩端就具有相同的主索引值。3. 案例分析1)單向一對一:(公民與身份證)方式一:基於唯一主鍵 Citizen.hbm.xml <?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 package="com.hbsi.one2one_fk"> <class name="Citizen" table="citizen_fk"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name"/> <many-to-one name="idCard" column="id_card" unique="true" cascade="save-update"></many-to-one> </class></hibernate-mapping> IdCard.hbm.xml <?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 package="com.hbsi.one2one_fk"> <class name="IdCard" table="idCard_fk"> <id name="id"> <generator class="native"/> </id> <property name="no" column="no"/> </class></hibernate-mapping> 方式二:基於外鍵 Citizen.hbm.xml <?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 package="com.hbsi.one2one_pk"> <class name="Citizen" table="citizen_pk"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" column="name"/> <one-to-one name="idCard" cascade="save-update"/> </class></hibernate-mapping> IdCard.hbm.xml與基於主鍵的一樣,同樣都是一般情況,沒有特殊2).雙一對一:(公民與身份證)方式一:基於唯一主鍵 Citizen.hbm.xml<?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 package="com.hbsi.one2oneboth_fk"> <class name="Citizen" table="citizenboth_fk"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name"/> <many-to-one name="idCard" unique="true" column="id_card" cascade="all"></many-to-one> </class></hibernate-mapping> IdCard.hbm.xml <?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 package="com.hbsi.one2oneboth_fk"> <class name="IdCard" table="idCardboth_fk"> <id name="id"> <generator class="native"/> </id> <property name="no" column="no"/> <one-to-one name="citizen" property-ref="idCard"></one-to-one> </class></hibernate-mapping> 方式二:基於外鍵 Citizen.hbm.xml <?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 package="com.hbsi.one2oneboth_pk"> <class name="Citizen" table="citizenboth_pk"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" column="name"/> <one-to-one name="idCard" cascade="save-update"/> </class></hibernate-mapping> IdCard.hbm.xml <?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 package="com.hbsi.one2oneboth_pk"> <class name="IdCard" table="idCardboth_pk"> <id name="id"> <generator class="native"/> </id> <property name="no" column="no"/> <one-to-one name="citizen"></one-to-one> </class></hibernate-mapping>