Hibernate4.x之映射关系--一对一映射

Hibernate的1-1映射关系主要分为两类: 

1.Hibernate基于外键映射的1对1关联关系
  对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique="true"属性表示为1-1关联

1 <many-to-one name="mgr" class="com.yl.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true"></many-to-one>

  另一端需要使用one-to-one元素,该元素使用property-ref属性指定使用被关联实体主键以外的字段作为关联字段

1 <one-to-one name="dept" class="com.yl.hibernate.one2one.foreign.Department" property-ref="mgr"></one-to-one>

  --如果不使用property-ref属性,SQL如下:
  

1 from
2     MANAGERS manager0_
3 left outer join
4     DEPARTMENTS department1_
5 on manager0_.MGR_ID=department1_.DEPT_ID

--如果使用property-ref属性,SQL如下:

1 from
2     MANAGERS manager0_
3 left outer join
4     DEPARTMENTS department1_
5 on manager0_.MGR_ID=department1_.MGR_ID

------------------------------------代码------------------------------------------------------------------

Department.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.yl.hibernate.one2one.foreign.Department" table="DEPARTMENTS">
 7         <id name="deptId" type="java.lang.Integer">
 8             <column name="DEPT_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="deptName" type="java.lang.String">
12             <column name="DEPT_NAME" />
13         </property>
14
15         <!-- 使用many-to-one 的方式来映射1-1关联关系 -->
16         <many-to-one name="mgr" class="com.yl.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true"></many-to-one>
17
18     </class>
19 </hibernate-mapping>

Manager.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.yl.hibernate.one2one.foreign.Manager" table="MANAGERS">
 7         <id name="mgrId" type="java.lang.Integer">
 8             <column name="MGR_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="mgrName" type="java.lang.String">
12             <column name="MGR_NAME" />
13         </property>
14
15         <!-- 映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one 进行映射 -->
16         <!-- 没有外键的一端需要使用one-to-one元素,该元素使用property-ref 属性指定使用被关联实体主键以外的字段作为关联字段 -->
17         <one-to-one name="dept" class="com.yl.hibernate.one2one.foreign.Department" property-ref="mgr"></one-to-one>
18
19
20
21     </class>
22 </hibernate-mapping>

2.Hibernate基于主键映射的1对1关联关系
  基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据“”对方“的主键来生成自己的主键,自己并不能独立生成主键。<param>子元素指定使用当前持久化类的哪个属性作为"对方"

1 <id name="deptId" type="java.lang.Integer">
2     <column name="DEPT_ID" />
3     <!-- 使用外键的方式来生成当前的主键 -->
4     <generator class="foreign">
5         <!-- property属性指定使用当前持久化类的哪一个属性的主键作为外键 -->
6         <param name="property">mgr</param>
7     </generator>
8 </id>

  采用foreign主键生成器策略的一端增加one-to-one元素映射关联属性,其one-to-one属性还应增加constrained="true"属性;另一端增加one-to-one元素映射关联属性
  constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象("对方")所对应的数据库表主键

------------------------------------代码------------------------------------------------------------------

Department.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping>
 6     <class name="com.yl.hibernate.one2one.primary.Department" table="DEPARTMENTS">
 7         <id name="deptId" type="java.lang.Integer">
 8             <column name="DEPT_ID" />
 9             <!-- 使用外键的方式来生成当前的主键 -->
10             <generator class="foreign">
11                 <!-- property属性指定使用当前持久化类的哪一个属性的主键作为外键 -->
12                 <param name="property">mgr</param>
13             </generator>
14         </id>
15         <property name="deptName" type="java.lang.String">
16             <column name="DEPT_NAME" />
17         </property>
18
19         <one-to-one name="mgr" class="com.yl.hibernate.one2one.primary.Manager" constrained="true"></one-to-one>
20     </class>
21 </hibernate-mapping>

Manager.hbm.xml

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2014-11-29 20:05:53 by Hibernate Tools 3.4.0.CR1 -->
 5 <hibernate-mapping package="com.yl.hibernate.one2one.primary">
 6     <class name="Manager" table="MANAGERS">
 7         <id name="mgrId" type="java.lang.Integer">
 8             <column name="MGR_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="mgrName" type="java.lang.String">
12             <column name="MGR_NAME" />
13         </property>
14
15         <!--
16             采用foreign主键生成器策略的一端增加one-to-one元素映射关联属性,
17             其one-to-one节点还应增加constrained="true"属性;以使当前的主键上添加外键约束
18          -->
19         <one-to-one name="dept" class="Department" property-ref="mgr"></one-to-one>
20
21
22
23     </class>
24 </hibernate-mapping>
时间: 2024-10-29 03:02:53

Hibernate4.x之映射关系--一对一映射的相关文章

Hibernate4.x之映射关系--继承映射

Hibernate的继承映射可以理解为持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持以下三种继承映射策略: 使用subclass进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态 使用joined-subclass进行映射:对于继承关系中的子类使用同一个表,这就需要在数据库表汇总增加额外的区分子类类型的字段 使用union-

hibernate 映射关系—集合映射

1.集合映射简介 当持久化类中有一个值类型的集合,那么就需要一张额外的数据库表来保存这个值类型集合的数据,这张表被称为集合表.比如有一张学生表,学生可能有很多爱好,就需要一种学生爱好集合表来存储学生的爱好信息. Hibernate支持大部分重要的JDK集合接口映射,主要有以下几种. 1. set 可以映射类型为java.util.Set接口的属性,它的元素存放没有顺序且不允许重复:也可映射类型为java.util.SortSet接口的属性.它的元素可以按自然顺序排列. 2. list 可以映射类

hibernate(四) 双向多对多映射关系

序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感觉还是比较容易的,需要理清楚其数据库关系图,那么你就拿下了它.映射文件的配置还是那么些死东西. --WH 一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p

java框架篇---hibernate(一对一)映射关系

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从一种形式转换到另外一种形式. 面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.内存中的对象之间存在关联和继承关系,而在数据库中,关系数

Hibernate中的一对一映射关系

Hibernate中的一对一映射关系有两种实现方法(一对一关系:例如一个department只能有一个manager) I使用外键的方式 步骤:1在一对一关联的持久化类中互相添加对方对象属性,   例如在department中添加private manager manager属性:   department代码如下: package com.atguigu.hibernate.one2one.foreign; public class Department { private Integer d

Hibernate之实现一对一关联映射关系

Hibernate中实现一对一映射有基于外键的方式和基于主键的方式.由于基于主键方式的映射在实现删除等操作时存在的问题且不够灵活,一般建议使用基于外键的方式实现. 以个人与身份证的关系为例(主要看映射文件的配置和实体类): 基于外键的方式: package test.hibernate.hbmOneToOne; public class Person { private Integer id; private String name; private IDCard idCard; public

hibernate关系映射(一对一)

一对一关联分为外键关联和主键关联:外键关联是指从表中存在主表的外键,这也是一种特殊的多对一关系:主键关联是指主从表的id一致 外键关联 主表:IDCard(校园卡) 从表:Student(学生) 学生类的定义和hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 //持有idcard的外键 5 private IDCard idCard; 6 }  可以看到 学生持有校园卡外键的类结构和之前多

JPA总结——实体关系映射(一对一@OneToOne)

一对一(@OneToOne) · 单向关联# 注释@OneToOne定义如下:@Target({METHOD, FIELD}) @Retention(RUNTIME)public @interface OneToOne {    Class targetEntity() default void.class;    CascadeType[] cascade() default {};    FetchType fetch() default EAGER;    boolean optional