【Hibernate】关系映射

【Hibernate】关系映射【Hibernate】关系映射

大家好,又见面了,我是你们的朋友全栈君。

    上一篇博客从整体上认识了一下Hibernate的映射关系,今天就来总结一些常用的关系映射。

一.多对一关联映射

    比如用户和组的关系,多个用户可能对应一个组,所以我们就会在“多”的一端加入外键,指向“一”的一端。

【Hibernate】关系映射

1.首先我们会在“多”端的实体中引入“一”端的实体,并生成相应的get,set方法

比如多个用户对应一个分组,我们就会在User实体类中引用Group

        private Group group;
	
	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}

2.在“多”端的配置文件中添加关系映射,比如在user.hbm.xml中添加标签:

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!--维护多对一关系-->
		<many-to-one name="group" column="groupid" cascade="save-update"/>
	</class>
</hibernate-mapping>

二.单向的一对一关联映射

主键关联

    就是让两个实体的主键一样,就不需要加入多余的字段了。比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。

【Hibernate】关系映射

1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;

2、Person端维护关系,所以需要重点看Person的配置文件,在Person.hbm.xml中,使Person中的Id既为主键又为外键。所以需要修改Person中的id标签:告诉Person里的id去关联哪个实体里的id。

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

唯一外键关联

    外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one>标签来映射,指定多的一端uniquetrue,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。

【Hibernate】关系映射

1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。

2、配置文件:IdCard.hbm.xml里都是普通属性。Person.hbm.xml的主键生成策略为native,使用<many-to-one>标签来维护外键,<many-to-one name=”idCard” unique=”true”/>。

注意:因为一对一的主键关联映射扩展性不好,当我们的需要发生改变想要将其变为一对多的时候变无法操作了,所以我们遇到一对一关联的时候经常会采用唯一外键关联来解决问题,而很少使用一对一主键关联。

三.双向的一对一关联映射

【Hibernate】关系映射

1、在Person和IdCard里添加对应端的引用,即添加相应属性。

2、在person.hbm.xml中添加<many-to-one>标签

<many-to-one name="idCard" unique="true"/>

  在IdCard端新加入如下标签映射:

[java] 
view plain  
copy

  1. <one-to-one name=“person”property-ref=“idCard”/>  

    注意:一对一唯一外键关联双向采用<one-to-one>标签映射,必须指定<one-to-one>标签中的property-ref属性为关系字段的名称

四.单向一对多关联映射

    一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端。比如学生和班级的关系:

【Hibernate】关系映射

 注意:它与多对一的区别是维护的关系不同

 *多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来

 *一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

 关键映射代码——在一的一端加入如下标签映射:

[java] 
view plain  
copy

  1. <set name=“students”>  
  2.       <key column=“classesid”/>  
  3.       <one-to-many class=“com.tgb.hibernate.Student”/>  
  4. </set>  

       缺陷:因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系)所以在保存Student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则将无法保存数据,常用解决办法是改用双向关联映射。

五.双向一对多关联映射

    采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

一对多双向关联的映射方式:

* 在一的一端的集合上采用<key>标签,在多的一端加入一个外键

* 在多的一端采用<many-to-one>标签

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱

关键映射代码:

    在Classes的一端加入如下标签映射:     

[java] 
view plain  
copy

  1. <set name=“students”inverse=“true”>  
  2.        <key column=“classesid”/>  
  3.       <one-to-many class=“com.hibernate.Student”/>  
  4. </set>  

          在Student的一端加入如下标签映射:

[java] 
view plain  
copy

  1. <many-to-one name=“classes” column=“classesid”/>  

inverse属性

   * inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效。

   * inverse是控制方向上的反转,只影响存储





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105697.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误

    SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误1、如下图,在使用SharePoint2013产品准备工具的时候,网上下载安装WindowsServerAppFabric的时候,报错,点击完成重启计算机,重新安装依然报错。2、无奈之下,只有选择手动安装,下载好安装包,双击安装;安装完成就报错,但是有如下提示,不过相比日志看起来人性化多了。由于安装程序MSI返回错误代码1603,因此,AppFabric安装失败。3、经

    2022年10月16日
    2
  • bs架构与cs架构的区别详细讲解_数据库为什么cs架构

    bs架构与cs架构的区别详细讲解_数据库为什么cs架构C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。 B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户

    2025年6月24日
    5
  • MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片最近有同学问我如何实现 MFC 基于对话框在图片控件中加载图片 其实使用 MFC 显示图片的方法各种各样 但是还是有些同学不知道怎样显示 以前在 数字图像处理 课程中完成的软件都是基于单文档的程序 这里介绍两种在对话框 picthre 控件中显示 BMP 图片的最简单基础的方法 方法可能并不完美 高手忽略 但是提供一种能运行的方法 希望对刚接触这方面知识的同学有所帮助 可能你觉得

    2025年10月26日
    2
  • linux下,查看redis版本号,一行命令搞定。[通俗易懂]

    linux下,查看redis版本号,一行命令搞定。[通俗易懂]进入redis部署目录,输入命令./redis-server–version,搞定。具体如下。[root@idoxuredis]#./redis-server–versionRedisserverv=3.2.0sha=00000000:0malloc=jemalloc-4.0.3bits=64build=74a42375bc62…

    2022年5月22日
    38
  • linux系统重启网卡命令_linux查看网卡配置

    linux系统重启网卡命令_linux查看网卡配置在实际工作中,经常会遇到Linux系统进行重启网卡的操作。接下来是小编为大家收集的linux系统重启网卡方法,希望能帮到大家。linux系统重启网卡方法一、servicenetworkrestart1、首先用CRT工具连接到Linux命令行界面。或者进入操作系统界面,选择终端输入。2、如果我们对所有的网卡进行重启操作。可以尝试输入:servicenetworkrestart命令进行操…

    2022年9月22日
    2
  • ps修图教程新手入门:如何用Photoshop处理证件照「建议收藏」

    ps修图教程新手入门:如何用Photoshop处理证件照「建议收藏」今天小编给大家讲解如何用Photoshop处理证件照,证件照是大家生活中经常要用到的,相信很多同学碰到过需要给背景照换颜色的时候,却不知道如何更换背景颜色。我们平时照的证件照,一般都是红底,这时我们遇到要蓝底的时候怎么办呢?下面讲解ps修图教程新手入门如何用Photoshop处理证件照。下面,以一寸照片为例,讲解如何用Photoshop制作证件照。1、电脑操作2、ps软件:AdobePhotoshop2017(演示)一、ps改变尺寸1、打开证件照原件(图片小编从网上下载了一张,并打码

    2022年6月26日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号