心得5-hibernate级联之一对一单双向剖析
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>