zoukankan      html  css  js  c++  java
  • 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库。

    【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识。

    【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单。

    【SSH进阶之路】Hibernate映射——多对一单向关联映射(四),我们介绍了多对一的关联映射,并详细了解说了,映射技巧,这篇我们依旧使用此映射技巧,帮助大家更好的理解。

          下面开始今天的愉快之旅。

    映射原理

          两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象模型,如下图所示:

    对象模型

           

            从上图中可以看出:

            1、一个人只有一张身份证,唯一的一个身份证号,对象之间是一对一的关系;

            2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

            从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看下面的内容。

    分类: 

     主键关联:

            1、两个实体对象的主键一样,以表明它们之间的一一对应关系;

            2、不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

            以上两点恰与唯一外键关联相反。

     主键关联的关系模型

     Person.hbm.xml

    <?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.liang.hibernate">
    	<class name="Person" table="t_person">
    		<id name="id">
    		<!-- 采用foreign生成策略,forgeign会取得另外一个关联对象的标识 -->
    			<generator class="foreign" >
    				<param name="property">idCard</param>
    			</generator>
    		</id>
    		<property name="name"></property>
    		<!-- 
    			one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
    			也就是拿到关系字段值,根据对端的主键来加载关联对象
    			
    			constrained="true"表示约束,当前主键(person的主键)还是一个外键
    			参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
    		 -->
    		 <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 -->
    		<one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>
    	</class>
    </hibernate-mapping>

    生成的表结构以及测试数据:

    唯一外键关联:

           1、两个实体对象用一个外键来关联,以表表明对象之间的关系。

           2、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系

           所以它采用多对一的标签来映射,如下所示:

    <!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true,
    	这样就限制了多的一端的多重性为一,就是这样来映射的。
    -->
    <many-to-one name="" unique="true"></many-to-one>

    唯一外键的关系模型

    Person.hbm.xml

    <?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.liang.hibernate">
    	<class name="Person" table="t_person">
    		<id name="id">
    			<generator class="native" ></generator>
    		</id>
    		<property name="name"></property>
    		<!-- 由于它是一对一的唯一外键关联,它是多对一关联的特例,注释可以直接写成多对一关联-->
    		<!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->
    		<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>	
    	</class>
    </hibernate-mapping>

    生成的表结构以及测试数据:

     

    其他相同代码如下:

    Person

    public class Person {
    	private int id;
    	private String name;
    	private IdCard idCard;
    	
    	public IdCard getIdCard() {
    		return idCard;
    	}
    	public void setIdCard(IdCard idCard) {
    		this.idCard = idCard;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    }

    IdCard

    public class IdCard {
    	private int id;
    	private String cardNo;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getCardNo() {
    		return cardNo;
    	}
    	public void setCardNo(String cardNo) {
    		this.cardNo = cardNo;
    	}
    }

    IdCard.hbm.xml

    <?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.liang.hibernate">
    	<class name="IdCard" table="t_idCard">
    		<id name="id">
    			<generator class="native"></generator>
    		</id>
    		<property name="cardNo"></property>
    	</class>
    </hibernate-mapping>

    建议

    由于一对一主键关联映射具有以下两个缺点:

          1、灵活性差,没有办法改成多对一关联映射,不能应变多变的需求;

          2、必须先保存关联对象IdCard,之后才能保持Person;

    所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。


         下篇博文,我们介绍一对一双向关联映射,谢谢关注。

  • 相关阅读:
    ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
    ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
    EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
    EasyPlayerPro安卓流媒体播放器实现Android H.265硬解码流程
    EasyPlayer RTSP安卓Android播放器架构简析
    EasyPlayer RTSP安卓Android播放器架构简析
    解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
    解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
    EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
    EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放
  • 原文地址:https://www.cnblogs.com/ainima/p/6330986.html
Copyright © 2011-2022 走看看