【Hibernate步步为营】--双向关联一对一映射详解(二)
来源:互联网 发布:什么是计算机编程 编辑:程序博客网 时间:2024/06/06 09:47
回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-one>,另外还要在主映射的一端采用foreign外键关联属性。继续讨论双向关联的情况,在双向关联中还有一种外键关联没有讨论,接下来将会详细讨论双向外键关联。
二、双向外键关联
双向的外键关联可以理解为外键关联的一种特殊情况,这种特殊主要是由于它是一种双向的对应关系,在前篇文章中提到如果想要在一张表中添加一个外键字段的话可以使用<many-to-one>标签,它会关系模型中生成对应的外键列。这里想要实现双向的外键关联就必须使用该标签。
1、对象模型
先来看对象模型,人和身份证属于一对一的关系,一个人对应着一个身份,所以它们之间的多重性是一对一的,并且这种对应关系是双向的。所以它的对象模型同双向主键一对一是相同的,如下图:
2、关系模型
对应的关系模型会发生很大的变化,一对一的外键关联关系会在一张表中生成对应的外键,拿到人和身份证上来说也就是人的关系模型中会有一个身份证号的主键列,它们之间形成了双向的一对一的情况,如下图:
Person对象和IdCard对象内的代码同上篇文章中的对象代码一致,不在做代码罗列,唯一不同的是映射文件中的配置问题。
3、映射文件
idCard.hbm.xml映射文件,idCard表不是映射的主表,所以在做一对一的映射时需要使用的是<one-to-one>标签来配置,并且需要制定person关系模型中的外键属性,具体代码如下:
- <?xmlversion="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>
- <classname="com.src.hibernate.IdCard"table="IDCARD">
- <idname="id"type="int">
- <generatorclass="native"/>
- </id>
- <propertyname="cardNo"type="java.lang.String">
- <columnname="CARDNO"/>
- </property>
- <one-to-onename="person"property-ref="idCard"></one-to-one>
- </class>
- </hibernate-mapping>
Person.hbm.xml映射文件,person表是映射的主表,需要在该表中添加一个外键属性列来标示idCard表,所以这里需要使用<many-to-one>标签,在person对象中生成相应的外键,并且还要使用unique标明属性唯一。
- <?xmlversion="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>
- <classname="com.src.hibernate.Person"table="PERSON">
- <idname="id"type="int"column="personId">
- <generatorclass="native"/>
- </id>
- <propertyname="name"type="java.lang.String">
- <columnname="NAME"/>
- </property>
- <many-to-onename="idCard"column="idCardNo"unique="true"not-null="true"></many-to-one>
- </class>
- </hibernate-mapping>
对象的映射文件配置完成,接下来生成关系模型,SQL语句如下:
- alter table PERSONdrop foreignkey FK8C768F55794A52CA
- drop table if exists IDCARD
- drop table if exists PERSON
- create table IDCARD (idinteger notnull auto_increment, CARDNO varchar(255),primary key (id))
- create table PERSON (personIdinteger notnull auto_increment, NAMEvarchar(255), idCardNo integernot nullunique, primarykey (personId))
- alter table PERSONadd index FK8C768F55794A52CA (idCardNo),add constraint FK8C768F55794A52CAforeign 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>标签来生成新的外键列。
结语
双向关联中的一对一映射至此已经讨论完成,两篇文章主要讨论了双向关联中的两种用法,其实还是很简单的,记住一句话想要生成外键就使用<many-to-one>标签,如果唯一那就添加unique属性,<one-to-one>标签只是指明了一对一的关系它只是指明一个对象如何加载另一个对象并不在关系模型中添加新列。下篇文章将会对一对多关联展开讨论。
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- 【Hibernate步步为营】--双向关联一对一映射详解
- 【Hibernate步步为营】--双向关联一对一映射详解(一)
- 【Hibernate】二、Hibernate映射详解(一对一单向关联)
- 【Hibernate步步为营】--单向关联一对一映射
- hibernate 一对一双向关联映射
- 双向关联一对一映射详解(2)
- 双向关联一对一映射详解(1)
- hibernate一对一主键关联映射(二)---双向关联
- 【Hibernate步步为营】--(一对多映射)之双向关联
- 【Hibernate步步为营】--(一对多映射)之双向关联
- 【Hibernate步步为营】--(一对多映射)之双向关联
- Hibernate中的one2one映射实例二(一对一主键关联映射双向)
- Hibernate映射——一对一双向关联映射(六)
- Hibernate 关联映射之---- 一对一双向映射
- hibernate一对一主键关联映射双向
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- 建造者模式
- 05.实例篇:仿QQ好友列表——ExpandableListView可扩展列表的使用(上篇)
- struct1开发入门Demo
- 关于C++中枚举和整型之间的转换
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- Springmvc
- 加入中兴
- 通过Linux系统伪装方法加固服务器安全
- 写给准备参加秋招的学弟学妹们~一定要来看哦~
- day71(java环境变量+java接口一)
- Java 网络编程介绍
- POJ 2249 Remmarguts' Date
- UVa 208 - Firetruck