【Hibernate步步】--一对一映射双向关联具体解释(两)
很抱歉。有两天没更新博客文章,不要写文章一天真的感觉很是空的啊。制定一个写作习惯,想改也改不掉啊。说点题外话,前两天我收到一封私人信件给朋友,我写邀请函的文章OWS文章。一种技术用于研究图标工具,这位朋友的邀请,可是由于这几天开发的项目着急上线所以临时没有时间去研究。仅仅能等这周末了,利用周末的时间来研究然后更新类似的技术文章。
回到文章的正题,上篇文章讨论了双向主键关联,它事实上是一对一主键关联的一种特殊情况。想要实现双向的关联就必须在映射文件的两端同一时候配置<one-to-one>,另外还要在主映射的一端採用foreign外键关联属性。
继续讨论双向关联的情况,在双向关联中另一种外键关联没有讨论。接下来将会具体讨论双向外键关联。
二、双向外键关联
双向的外键关联能够理解为外键关联的一种特殊情况,这样的特殊主要是因为它是一种双向的相应关系。在前篇文章中提到假设想要在一张表中加入一个外键字段的话能够使用<many-to-one>标签,它会关系模型中生成相应的外键列。这里想要实现双向的外键关联就必须使用该标签。
1、对象模型
先来看对象模型,人和身份证属于一对一的关系。一个人相应着一个身份。所以它们之间的多重性是一对一的,而且这样的相应关系是双向的。所以它的对象模型同双向主键一对一是同样的。例如以下图:
2、关系模型
相应的关系模型会发生非常大的变化。一对一的外键关联关系会在一张表中生成相应的外键,拿到人和身份证上来说也就是人的关系模型中会有一个身份证号的主键列,它们之间形成了双向的一对一的情况,例如以下图:
它们之间的相应关系就是上图中看到的,person表中有idCard表的主键。形成了一对一的外键关联关系。并且是双向的,也就是说通过person可以获取到idCard,另外通过idCard也能获取到person。
Person对象和IdCard对象内的代码同上篇文章中的对象代码一致。不在做代码罗列。唯一不同的是映射文件里的配置问题。
3、映射文件
idCard.hbm.xml映射文件,idCard表不是映射的主表。所以在做一对一的映射时须要使用的是<one-to-one>标签来配置。而且须要制定person关系模型中的外键属性,详细代码例如以下:
<? xml version="1.0"? >
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-18 22:27:43 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.src.hibernate.IdCard" table="IDCARD">
<id name="id" type="int">
<generator class="native" />
</id>
<property name="cardNo" type="java.lang.String">
<column name="CARDNO" />
</property> <one-to-one name="person" property-ref="idCard"></one-to-one>
</class>
</hibernate-mapping>
Person.hbm.xml映射文件,person表是映射的主表,须要在该表中加入一个外键属性列来标示idCard表。所以这里须要使用<many-to-one>标签,在person对象中生成对应的外键,而且还要使用unique标明属性唯一。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-18 22:27:43 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.src.hibernate.Person" table="PERSON">
<id name="id" type="int" column="personId">
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property> <many-to-one name="idCard" column="idCardNo" unique="true" not-null="true"></many-to-one>
</class>
</hibernate-mapping>
对象的映射文件配置完毕,接下来生成关系模型。SQL语句例如以下:
alter table PERSON drop foreign key FK8C768F55794A52CA
drop table if exists IDCARD
drop table if exists PERSON
create table IDCARD (id integer not null auto_increment, CARDNO varchar(255), primary key (id))
create table PERSON (personId integer not null auto_increment, NAME varchar(255), idCardNo integer not null unique, primary key (personId))
alter table PERSON add index FK8C768F55794A52CA (idCardNo), add constraint FK8C768F55794A52CA foreign key (idCardNo) references IDCARD (id)
生成的SQL语句首先是创建的表。在建表时指定了主键列。创建完毕后改动了两个表指定外键属性。形成一对一的关系。
编写測试方法。採用单元測试,载入两个类的对象,并分别从对象的一端获取还有一个对象
//载入对象,使用IdCard对象装载person对象
public void testLoad1(){
Session session=null; try{
session=HibernateUtils.getSession();
session.beginTransaction(); //获取IdCard对象。在IdCard中获取与该对象唯一关联的person对象
IdCard idcard=(IdCard)session.load(IdCard.class,1);
System.out.println("person.Id= "+idcard.getPerson().getId());
System.out.println("idCard.person.name= "+idcard.getPerson().getName()); //获取Person对象。在Person对象中获取与它唯一关联的IdCard对象
Person person=(Person)session.load(Person.class,1);
System.out.println("idCard.id: "+person.getIdCard().getId());
System.out.println("idCard.cardNo: "+person.getIdCard().getCardNo()); //提交事务
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
生成的内容:
对照两种映射关系。主键和外键两种映射,都是双向的映射关系。须要在对象的两端同一时候配置映射关系。不同的是主键仅仅须要使用<one-to-one>由于它不须要生成属性列,可是必须对表的主键採用foreign的主键生成策略,并标示外键对象;外键的生成策略则须要採用<many-to-one>标签来生成新的外键列。
结语
双向关联中的一对一映射至此已经讨论完毕。两篇文章主要讨论了双向关联中的两种使用方法,事实上还是非常easy的,记住一句话想要生成外键就使用<many-to-one>标签。假设唯一那就加入unique属性,<one-to-one>标签仅仅是指明了一对一的关系它仅仅是指明一个对以及如何加载对象不在关系模型中添加新的列。下一篇文章将讨论一对多关联。
版权声明:本文博主原创文章,博客,未经同意不得转载。
【Hibernate步步】--一对一映射双向关联具体解释(两)的更多相关文章
- hibernate中一对一映射
一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...
- 9.hibernate的一对一映射
一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...
- Hibernate的一对一映射
一.创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql.Oracle.SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下 ...
- java之hibernate之多对多双向关联映射
1.比如在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Role.java public class Role implements Serializable{ priva ...
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- 【Hibernate步步为营】--映射合集汇总
前几篇文章具体讨论了对象模型到关系模型的转化方法,对映射关系做了具体的了解,Hibernate将对象模型转化为对应的关系模型是通过使用对应的映射来完毕的(相同也能够使用注解),对于对象之间的关系的转化 ...
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- Hibernate一对一双向关联映射
关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...
- ORM框架Hibernate (四) 一对一单向、双向关联映射
简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...
随机推荐
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...
- Ubuntu通过使用PyCharm 执行调试 Odoo 8.0 可能的问题
实现步骤,请移步http://shine-it.net/index.php?topic=16603.0 或 http://www.mindissoftware.com/2014/09/11/Run-O ...
- iOS 中client和server的 Web Service 网络通信 (2)
在实际的应用开发过程中,同步请求的用户体验并非非常好:我们都知道.Apple是非常重视用户体验的.这一点也成为了行业的标杆,没实用户哪里来的好产品.所以用户体验是极其重要的.貌似废话有点多.接下来进入 ...
- A左右ndroid正在使用Uri监视数据库中的更改
在监控数据库在线原创文章是非常小的变化,基本上没有找到一个实际的问题.所以,如果你看到一个有点蓝牙源代码,写一个Demo.在这里,供大家参考,查看源代码: src有三个文件MyDataProvider ...
- mybatis至mysql插入一个逗号包含值误差
mybatis至mysql插入形如"11,22,33"当误差.我使用了错误的原因是美元符号镶嵌sql.正确的做法是使用# 有时间去看看mybatis的$和#差异. 版权声明:本文 ...
- C#中的预编译指令介绍
原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...
- 玩转Web之easyui(一)-----easy ui datagird 分页
easy ui 中数据表格的分页其实是很简单的,分页是在数据表格可以正常显示数据的基础上进行的,在这里给出servlet的代码,其中selectAll()方法是从数据库中提取所有数据, 分页的一种思路 ...
- UVA 538 - Balancing Bank Accounts(贪心)
UVA 538 - Balancing Bank Accounts 题目链接 题意:给定一些人的欠钱关系,要求在n-1次内还清钱,问方案 思路:贪心,处理出每一个人最后钱的状态,然后直接每一个人都和最 ...
- 经验19--C#大事
以前学过C#大事.但我还没有搞懂怎么弄. 这一次,他们下进行了研究. 1.定义参数类,对于参数的传递活动.(可以省略) public class UserEventArgs { ...
- iOS_17_控制开关_TabBarController_由storyboard道路
最后效果图: main.storyboard BeyondViewController.m中有一句关键代码,设置tabbarItem图片的样式(30*30) // // BeyondViewContr ...