Hibernate详解(3)——一对一映射分析

点击上面  免费订阅本账号!

本公众号主要推送javaweb开发相关技术,基础知识点,同时会深入剖析复杂的问题,分享一些优秀的框架,大型项目经验,当今最流行的Javaweb技术,热点科技新闻,招聘信息,生活乐趣等等。点击上方的蓝字,这样您每天可以看到更多的java知识和资讯!完全是免费订阅,请放心关注。

本节讲述一下hibernate中一对一关系的配置和使用。一对一关系也是比较常见的一种关系,在Hibernate中可以分为单向一对一关系和双向一对一关系。分类的原因一般是由于需求决定的,单双向是站在不同的角度去看认为规定的。一对一关系相对来说比较少见。但是在某些时候也会用到。比如学生和学生证两个实体就是一对一的。

 

单向一对一


单向一对一是站在其中的一端看的,主要是根据需求决定的。单向标明一端持有另一端的引用,而另一端则没有引用。如下UML图:


这里面Student持有Card的引用,在加载Student的时候,Hibernate会自动加载上Card来。它们的hbm配置文件如下:

Student.hbm.xml.负责维护关系

[html] view plain copy

  1. <?xmlversionxmlversion="1.0"?>  

  2. <!DOCTYPEhibernate-mapping PUBLIC  

  3. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  5. <hibernate-mapping>  

  6. <classnameclassname="com.lsh.hibernate.Student" table="t_student">  

  7. <idnameidname="id">  

  8. <!--采用foreign生成策略,forgeign会取得关联对象的标识 -->  

  9. <generatorclassgeneratorclass="foreign">  

  10. <!--property只关联对象 -->  

  11. <paramnameparamname="property">card</param>  

  12. </generator>  

  13. </id>  

  14. <propertynamepropertyname="name"/>  

  15. <!--  

  16. one-to-one指示hibernate如何加载其关联对象,默认根据主键加载  

  17. 也就是拿到关系字段值,根据对端的主键来加载关联对象  

  18.    

  19. constrained="true表示,当前主键(person的主键)还是一个外键  

  20. 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句  

  21.  -->  

  22. <one-to-onenameone-to-onename="idCard" constrained="true"/>  

  23. </class>  

  24. </hibernate-mapping>  

Card.hbm.xml不负责维护主键,是一个简单的映射文件。

[html] view plain copy

  1. <?xmlversionxmlversion="1.0"?>  

  2. <!DOCTYPEhibernate-mapping PUBLIC  

  3. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  5. <hibernate-mapping>  

  6. <classnameclassname="com.lsh.hibernate.Card" table="t_card">  

  7. <idnameidname="id">  

  8. <generatorclassgeneratorclass="native"/>  

  9. </id>  

  10. <propertynamepropertyname="school"/>  

  11. </class>  

  12. </hibernate-mapping>  

  13.    

双向一对一


双向一对一是彼此都持有对方的引用,在一端加载的时候,另一端就会自动加载上来。看看双向一对一的UML


配置文件如下

[html] view plain copy

  1. Student.hbm.xml  

  2. <?xmlversionxmlversion="1.0"?>  

  3. <!DOCTYPEhibernate-mapping PUBLIC  

  4. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  5. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  6. <hibernate-mapping>  

  7. <class name="com.lsh.hibernate.Student" table="t_student">  

  8. <idnameidname="id">  

  9. <!--采用foreign生成策略,forgeign会取得关联对象的标识 -->  

  10. <generatorclassgeneratorclass="foreign">  

  11. <!--property只关联对象 -->  

  12. <param name="property">card</param>  

  13. </generator>  

  14. </id>  

  15. <propertynamepropertyname="name"/>  

  16. <!--  

  17. one-to-one指示hibernate如何加载其关联对象,默认根据主键加载  

  18. 也就是拿到关系字段值,根据对端的主键来加载关联对象  

  19.    

  20. constrained="true表示,当前主键(person的主键)还是一个外键  

  21. 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句  

  22.  -->  

  23. <one-to-one name="card" constrained="true"/>  

  24. </class>  

  25. </hibernate-mapping>  

它和上面的单向的Student.hbm.xml配置一样,这两个不同的是在Card.hbm.xml中使用<one-to-one>标签把它持有的student加载上来。

[html] view plain copy

  1. <?xmlversionxmlversion="1.0"?>  

  2. <!DOCTYPEhibernate-mapping PUBLIC  

  3. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  5. <hibernate-mapping>  

  6. <class name="com.lsh.hibernate.Card" table="t_card">  

  7. <idnameidname="id">  

  8. <generatorclassgeneratorclass="native"/>  

  9. </id>  

  10. <property name="school"/>  

  11. <one-to-one name="student"/>  

  12. </class>  

  13. </hibernate-mapping>  

  14.    

上面的两种一对一都是采用主键关联的方式,即它们两个表的主键是一样的,student用的表是采用foreign的方式,引用Card的主键。一对一关联还有一种外键关联的方式。它的UML图和双向一对一一样,只是配置文件不一样。

首先看一下它们各自的配置文件。Student.hbml.xmlCard.hbm.xml

[html] view plain copy

  1. <?xmlversionxmlversion="1.0"?>  

  2. <!DOCTYPEhibernate-mapping PUBLIC  

  3. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  5. <hibernate-mapping>  

  6. <classnameclassname="com.lsh.hibernate.Student" table="t_student">  

  7. <idnameidname="id">  

  8. <generatorclassgeneratorclass="native"/>  

  9. </id>  

  10. <propertynamepropertyname="name"/>  

  11. <many-to-onenamemany-to-onename="card" unique="true"/>  

  12. </class>  

  13. </hibernate-mapping>  

 

[html] view plain copy

  1. <?xmlversionxmlversion="1.0"?>  

  2. <!DOCTYPEhibernate-mapping PUBLIC  

  3. "-//Hibernate/HibernateMapping DTD 3.0//EN"  

  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  5. <hibernate-mapping>  

  6. <classnameclassname="com.bjpowernode.hibernate.Card" table="t_card">  

  7. <idnameidname="id">  

  8. <generatorclassgeneratorclass="native"/>  

  9. </id>  

  10. <propertynamepropertyname="school"/>  

  11. <one-to-onenameone-to-onename="student" property-ref="card"/>  

  12. </class>  

  13. </hibernate-mapping>  

  14.    

一对一外键关联,其实可以看做是一对多的一种特殊形式,多方退化成一。多方退化成一只需要在<many-to-one>标签中设置"unique"="true"。

这里面重要的一个知识点就是<many-to-one><one-to-one>的区别,这里主要应用了这个不同。<many-to-one>不仅可以加载到另一端的数据,还会在多的一端表中加入一个外键,而<one-to-one>只会加载另一端数据,不会影响表结构。

点击阅读全文阅读"4个步骤教你建立后台角色权限系统"

有人用微信聊天,有人却在微信中学习,成长。下面是2016最HOT IT公众号,赶快试试新的关注方法吧!


关注方式
★长按二维码,选择“识别图中二维码”进行关注。

 没看够?更多好文在阅读原文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值