心得5-hibernate级联之一对一单双向剖析
2012-12-22 10:32
387 查看
1.知识点概述
<!--格式化显示的sql语句,好看 -->
<property name="format_sql">true</property>
<!--显示sql语句 -->
<property name="show_sql">true</property>
关联关系包括多样性和方向性的关联。映射关联关系就是把对象模型中类之间的关联关系映射成关系模型中数据库表之间的外键引用关系。
2. 一对一关系
单向一对一:(公民与身份证)
方式一:基于唯一[b]主键[/b]
Citizen.hbm.xml
<many-to-one name=“idCard” column=“idCard_id”unique=“true” cascade=“all”/>
类似于多对一的关系书写,最重要的是unique=“true”这句话,来指明关系为一对一。
方式二:基于[b][b]外键[/b][/b]
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为真即写出.
<!--格式化显示的sql语句,好看 -->
<property name="format_sql">true</property>
<!--显示sql语句 -->
<property name="show_sql">true</property>
关联关系包括多样性和方向性的关联。映射关联关系就是把对象模型中类之间的关联关系映射成关系模型中数据库表之间的外键引用关系。
2. 一对一关系
单向一对一:(公民与身份证)
方式一:基于唯一[b]主键[/b]
Citizen.hbm.xml
<many-to-one name=“idCard” column=“idCard_id”unique=“true” cascade=“all”/>
类似于多对一的关系书写,最重要的是unique=“true”这句话,来指明关系为一对一。
方式二:基于[b][b]外键[/b][/b]
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>
相关文章推荐
- 心得5-hibernate级联之一对一单双向剖析
- 心得6-hibernate级联之多对多单双向剖析
- 心得6-hibernate级联之多对多单双向剖析
- 心得4-hibernate入门4 级联之双向一对多与多对一
- 心得4-hibernate入门4 级联之双向一对多与多对一
- 心得7-hibernate级联之多对多转换为多对一的问题剖析
- 心得7-hibernate级联之多对多转换为多对一的问题剖析
- hibernate级联之多对多转换为多对一的问题剖析
- hibernate一对多双向级联删除
- Hibernate一对多双向级联操作
- Hibernate双向一对多级联添加
- hibernate 级联删除 双向一对多
- Hibernate学习之级联操作2——一对多双向自身关联关系
- hibernate中双向关联在级联情况下save对象讨论
- hibernate 双向一多对关联 删除一端时级联删除多端
- hibernate级联之多对多转换为多对一的问题剖析
- hibernate 双向一多对关联 删除一端时级联删除多端
- hibernate级联之多对多转换为多对一的问题剖析
- hibernate学习心得
- Hibernate双向多对一