Hibernate中的一对一映射关系
Hibernate中的一对一映射关系有两种实现方法(单向一对一,和双向一对一)(一对一关系:例如一个department只能有一个manager)
单向和双向有什么区别呢??
例如若是单向一对一,比如在department中插入一个外键关联manager表(manager_id),那此时插入数据时,就必须先插入manager表的数据再插入department表的数据,而且使用Hibernate检索数据时,查询department的数据,如果没有使用懒加载,则manager的对应的数据也会被查询处出来,
但是如果是双向一对一,可以任意插入一方的数据,查询数据时,无论查询哪一方,被关联方也会被检索处理
I单向一对一
配置步骤:
①:分析1端和n端(如果是一对一关系的时候,可以选择任意一方为N端,)
②:在1端插入n端的集合属性(因为是一对一,所以不可以使集合对象属性,只能使用对象属性)
③:在n端插入一端的对象属性
④:注明关系在那一段维护
步骤:1在一对一关联的持久化类中互相添加对方对象属性,
例如在department中添加private manager manager属性:
department代码如下:
package com.atguigu.hibernate.one2one.foreign;
public class Department {
private Integer deptId;
private String deptName;
private Manager mgr;
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
manager的代码:
package com.atguigu.hibernate.one2one.foreign;
public class Manager {
private Integer mgrId;
private String mgrName;
private Department dept;
public Integer getMgrId() {
return mgrId;
}
public void setMgrId(Integer mgrId) {
this.mgrId = mgrId;
}
public String getMgrName() {
return mgrName;
}
public void setMgrName(String mgrName) {
this.mgrName = mgrName;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
2对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素且增加unique=“true” 属性来表示为1-1关联
<?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> <class name="com.atguigu.hibernate.one2one.foreign.Department" table="DEPARTMENTS"> <id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="native" />
</id> <property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property> <!-- 使用 many-to-one 的方式来映射 1-1 关联关系,其实many-to-one 就是可以用来生成外键 -->
<many-to-one name="mgr" class="com.atguigu.hibernate.one2one.foreign.Manager" column="MGR_ID" unique="true">
</many-to-one>
</class>
</hibernate-mapping>
另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段(就是要指定外键是哪一个,记得是使用Java的属性名,不是使用Sql的列名)
<?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> <class name="com.atguigu.hibernate.one2one.foreign.Manager" table="MANAGERS"> <id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id> <property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property> <!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
<!--
没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
-->
<one-to-one name="dept" class="com.atguigu.hibernate.one2one.foreign.Department"
property-ref="mgr"></one-to-one> </class> </hibernate-mapping>
对于一对一关联映射,记得千万不要两张表都设置外键,这样会引起逻辑错误的
II双向一对一映射关系
步骤:1在一对一关联的持久化类中互相添加对方对象属性,
例如在department中添加private manager manager属性:这个代码跟I那里没区别,都一样
2在需要生成外键的那个表对应的持久化类的.hbm.xml文件中指定主键的映射策略为foreign策略,
表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用
当前持久化类的哪个属性作为 “对方” 采用foreign主键生成器策略的一端增加 one-to-one 元素
映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性
代码如下:
<?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.atguigu.hibernate.one2one.primary">
<class name="Department" table="DEPARTMENTS"> <id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<!-- 使用外键的方式来生成当前的主键 -->
<generator class="foreign">
<!-- property 属性指定使用当前持久化类的哪一个属性的主键作为外键 -->
<param name="property">mgr</param>
</generator>
</id> <property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property> <!--
采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,
其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束
-->
<one-to-one name="mgr" class="Manager" constrained="true"></one-to-one> </class>
</hibernate-mapping>
另一端增加one-to-one元素映射关联属性。
<?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> <class name="com.atguigu.hibernate.one2one.primary.Manager" table="MANAGERS"> <id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id> <property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property> <one-to-one name="dept" class="com.atguigu.hibernate.one2one.primary.Department">
</one-to-one> </class> </hibernate-mapping>
以上就是一对一映射关系的配置,不过有没有想到,当从不同的表来访问关联表的数据,访问过程是怎样的???()
Hibernate中的一对一映射关系的更多相关文章
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- 【Hibernate步步】--一对一映射双向关联具体解释(两)
很抱歉.有两天没更新博客文章,不要写文章一天真的感觉很是空的啊.制定一个写作习惯,想改也改不掉啊.说点题外话,前两天我收到一封私人信件给朋友,我写邀请函的文章OWS文章.一种技术用于研究图标工具,这位 ...
- Hibernate中的一对一关联和组件的映射
Hibernate提供了两种映射一对一映射关联关系的方式: 01.按照外键映射 02.按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这 ...
- Hibernate中的一对一关系详解(1)
A:先讲讲一对一的关系(欲知其他关系,请看下篇) a:主键关联的一对一关系 一对一关系一般用主键关联,也就是说用主键值来维护两者的关系,一个表的主键存放另一个表的主键值.例如在员工与帐号中,我们取员工 ...
- java框架篇---hibernate(一对一)映射关系
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从 ...
- Hibernate中的一对一关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- 【Hibernate 3】一对一映射配置
一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...
随机推荐
- java中成员变量、代码块、构造函数运行顺序
1.java虚拟机执行程序,首先须要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类. 初始化子类静态代码块和成员变量 2.load完成父类与子类后,从main函数入口运行 ...
- Python|PyCharm安装scrapy包
[转]http://www.cnblogs.com/xiaoli2018/p/4566639.html
- 安装语言包(LANGUAGE PACKAGE)
by 枫竹丹青 一.说明 在SAP ECC 安装好后,如果是生产版本,通常只有两种语言--英语和德语.这时如需中文环境,则需定义支持的语言类型并导入语言包.如果安装的是IDES版,则系统中已包含了几十 ...
- jquery 获取绑定事件
在1.8.0版本之前,我们要想获取某个DOM绑定的事件处理程序可以这样: 1 $.data(domObj,'events');//或者$('selector').data('events') 而从1. ...
- Spring Mvc中DispatcherServlet和Servlet的区别小结
在web开发过程中开始接触的是servlet,用来处理用户请求.这几年随着spring 框架越来越成熟,几乎成了java web开发界的主流框架.既然这么受欢迎肯定有它的优点,spring框架在原来的 ...
- hdu6121 Build a tree 模拟
/** 题目:hdu6121 Build a tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:n个点标号为0~n-1:节点i的父节点 ...
- thinkphp 如何调用百度echarts 数据报表插件
echarts官网网址:http://echarts.baidu.com/ echarts源码地址:http://echarts.baidu.com/build/echarts-2.2.7.zip ...
- jQuery控制的不同方向的滑动(横向滑动等)
引入jquery.js,复制以下代码,即可运行. <style type="text/css"> .slide { position: relative; height ...
- 【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1621 这题用笔推一下就懂了的.... 当2|(n-k)时,才能分,否则不能分. 那么dfs即可.. ...
- exif_imagetype() 函数在linux下的php中不存在
1.问题,项目中上传文件使用插件时,windows上支持函数exif_imagetype(),而在linux上不支持. 2.PHP exif_imagetype的本质 PHP exif_imagety ...