标签:style blog class c code java
很不好意思,有两天时间没有更新博客文章了,不写文章的日子还真是感觉很空洞啊,养成了写文章的恶习想改也改不掉啊。说点题外话,前两天收到一位朋友的私信,邀请笔者写一篇有关OWS的文章,用来研究图标工具的一种技术,很荣幸收到这位朋友的邀请,但是因为这几天开发的项目着急上线所以暂时没有时间去研究,只能等这周末了,利用周末的时间来研究然后更新类似的技术文章。回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-one>,另外还要在主映射的一端采用foreign外键关联属性。继续讨论双向关联的情况,在双向关联中还有一种外键关联没有讨论,接下来将会详细讨论双向外键关联。
双向的外键关联可以理解为外键关联的一种特殊情况,这种特殊主要是由于它是一种双向的对应关系,在前篇文章中提到如果想要在一张表中添加一个外键字段的话可以使用<many-to-one>标签,它会关系模型中生成对应的外键列。这里想要实现双向的外键关联就必须使用该标签。
先来看对象模型,人和身份证属于一对一的关系,一个人对应着一个身份,所以它们之间的多重性是一对一的,并且这种对应关系是双向的。所以它的对象模型同双向主键一对一是相同的,如下图:
对应的关系模型会发生很大的变化,一对一的外键关联关系会在一张表中生成对应的外键,拿到人和身份证上来说也就是人的关系模型中会有一个身份证号的主键列,它们之间形成了双向的一对一的情况,如下图:
Person对象和IdCard对象内的代码同上篇文章中的对象代码一致,不在做代码罗列,唯一不同的是映射文件中的配置问题。
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>
<?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>
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)
//加载对象,使用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); } }
双向关联中的一对一映射至此已经讨论完成,两篇文章主要讨论了双向关联中的两种用法,其实还是很简单的,记住一句话想要生成外键就使用<many-to-one>标签,如果唯一那就添加unique属性,<one-to-one>标签只是指明了一对一的关系它只是指明一个对象如何加载另一个对象并不在关系模型中添加新列。下篇文章将会对一对多关联展开讨论。
【Hibernate步步为营】--双向关联一对一映射详解(二),布布扣,bubuko.com
【Hibernate步步为营】--双向关联一对一映射详解(二)
标签:style blog class c code java
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/26553567