Hibernate框架【三】——基本映射——一对一映射

news2024/12/23 1:18:57

系列文章目录


一对一映射

  • 系列文章目录
  • 前言
  • 一、一对一映射是什么?
  • 二、一对一单向关联
    • ①一对一主键关联映射
    • ②一对一唯一外键映射
  • 三、一对一双向关联
    • ①一对一主键关联映射(双向关联Person<----->IdCard)
    • ②h一对一唯一外键关联映射(双向关联Person<----->IdCard)
  • 总结


前言

由于公司项目上进行面向对象的架构设计对于ORM部分使用的是Spring Data JPA框架。将ORM完全交给Spring Data JPA框架,而Hibernate是Spring Data JPA的实现方式之一,通过对HIbernate框架的学习能够更好的理解ORM框架,以及Spring Data JPA框架。
下面的博客是对于Hibernate框架中的基本映射中的一对一映射进行的实践,总结的并不全面,旨在对于一对一映射关系有一个宏观了解并能够进行基本运用。


一、一对一映射是什么?

一对一映射是指两个实体之间存在一对一的关系,其中一个实体与另一个实体关联的方式是通过共享相同的主键或唯一键来建立关系。
关联关系整体上分为两大类,分为单向关联及我知道你,而你不知道我,双向关联双方都知道彼此。在一对一映射中单向关联分为:一种方式是一对一主键关联映射另一种方式是一对一唯一外键关联映射。一对一双向关联也是如此。

二、一对一单向关联

案例:现在有两个实体Person实体和IdCard。

package com.wangwei.hibernate;

public class Person {

    private int id;
    
    private String name;
    
    private 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;
    }

    public IdCard getIdCard() {
        return idCard;
    }

    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }
}

package com.wangwei.hibernate;

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;
    }
}

①一对一主键关联映射

我将人查出来我要能够看到身份证信息,通过唯一主键进行关联。

示意图:
在这里插入图片描述

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

最终生成的表结构
在这里插入图片描述
在这里插入图片描述

②一对一唯一外键映射

①和②相比较建议使用②,②可以更改为多对一映射(一对一唯一外键映射,是多对一映射关系的特例)

示意图
在Person中添加idCard字段
在这里插入图片描述

使用XML配置方式定义一对一主键映射
实体IdCard对应的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>
    <class name="com.wangwei.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <!-- 采用<many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性
为一 -->
        <many-to-one name="idCard" unique="true"/>
    </class>
</hibernate-mapping>

生成的表结构
在这里插入图片描述
在这里插入图片描述

三、一对一双向关联

①一对一主键关联映射(双向关联Person<----->IdCard)

需要在IdCard加入标签,指示hibernate将关联对象Person
根据主键加载上来
不影响存储,只影响加载

在实体IdCard中声明Person类型的属性

package com.wangwei.hibernate;

public class IdCard {
    
    private int id;
    
    private String cardNo;
    
    private Person person;
    
    

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    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;
    }
}

示意图
在这里插入图片描述
使用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>
    <class name="com.wangwei.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="cardNo"/>
        <one-to-one name="person"/>
    </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">
<hibernate-mapping>
    <class name="com.wangwei.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>

生成的表结构
在这里插入图片描述
在这里插入图片描述

②h一对一唯一外键关联映射(双向关联Person<----->IdCard)

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

在实体IdCard中声明Person类型的属性

package com.wangwei.hibernate;

public class IdCard {
    
    private int id;
    
    private String cardNo;
    
    private Person person;
    
    

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    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;
    }
}

使用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>
    <class name="com.wangwei.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="cardNo"/>
        
        <one-to-one name="person" property-ref="idCard"/>
    </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">
<hibernate-mapping>
    <class name="com.wangwei.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="idCard" unique="true"/>
    </class>
</hibernate-mapping>

生成的表结构
在这里插入图片描述
在这里插入图片描述

总结

  1. 一对一映射可用于将相关实体进行关联,保证关联的一对一关系的数据完整性和一致性。
  2. 我们通过一对一映射将实体进行关联之后,特别时在进行查询的时候,可以查询出该实体所关联到的实体。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3ds MAX 绘制简易沙发

目的是用3dMAX绘制简易的沙发 用到了长方体、圆角长方体、平移、旋转、阵列、组等操作 首先按照前面的教程创建一个圆角长方体&#xff0c;参数如图&#xff1a; 接着用圆柱体绘制靠背的支柱&#xff0c;为了方便使用阵列一次绘制出十个 我们设置的沙发长度为1&#xff4d;这…

Kibana:为 Kibana 定制自己的品牌 - 8.8

我还记得我刚加入 Elastic 的时候&#xff0c;那个时候在论坛里看到一个贴上是关于如何替换 Kibana 中的 Logo 从而重新定制自己的品牌。在今天&#xff0c;我非常高兴地告诉你&#xff0c;在 Elastic Stack 8.8 中&#xff0c;这个是完全可以通过配置的方式来实现的。 安装 如…

软考A计划-试题模拟含答案解析-卷十三

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

JS中数组22种常用API总结,slice、splice、map、reduce、shift、filter、indexOf......

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 一、引言 在前端开发中&#xff0c;数组是一种常见且重要的数据结构。数组提供了许多便捷的…

【录用案例】1区SCI仅1个月14天录用,新增19篇录用、5篇见刊、6篇检索

2023年5月20日-2023年5月26日&#xff0c;经核实&#xff0c;由我处Unionpub学术推荐的19篇论文已被期刊部录用、5篇见刊、6篇检索&#xff1a; 2区肿瘤类SCI 【期刊简介】IF:4.5-5.0&#xff0c;JCR2区&#xff0c;中科院2区 【检索情况】SCI 在检&#xff0c;正刊 【征稿…

一文包你学会网络数据抓包

本篇将图文并茂教你如何使用抓包工具&#xff0c;并在文章最后教大家如何偷取FTP的用户名密码。 一、安装 本文为大家介绍一个非常好用的抓包工具&#xff0c;科来。 下载地址&#xff1a; http://www.colasoft.com.cn/ 下载科莱 下载完毕&#xff0c;双击直接下一步即可安…

msvcr71.dll丢失的解决方法,多种修复方法全方位分享

当我们在使用某些软件时&#xff0c;可能会出现提示“msvcr71.dll丢失”的错误信息。这个错误信息意味着我们的电脑缺少msvcr71.dll文件&#xff0c;这个文件是由Microsoft Visual C 2003运行库提供的。如果我们遇到这个问题&#xff0c;我们需要采取措施来解决它。本文将介绍m…

体验管理|如何快速低成本开始体验相关的数字化工作‼️

Guofu 第 95⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; &#x1f68f; 写在前面 在体验经济时代&#xff0c;传统企业在应对新需求、新挑战的时候&#xff0c;也需要用新的方式进行企业升级和转型…

DailyMart03:如何基于DDD设计商城的领域模型?

大家好&#xff0c;我是飘渺。既然有人催更那今天咱们就继续更新DDD&微服务系列&#xff01; 在面向对象开发中&#xff0c;所有事物都可以看作是对象。然而&#xff0c;在日常开发中&#xff0c;我们通常从数据出发来设计对象的表现形式&#xff0c;这种做法侧重于数据属性…

二、高通相机bringup 流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、相机Sensor 点亮相关的文件二、Sensor 驱动文件详解 一、相机Sensor 点亮相关的文件 1.1 Sensor 驱动XML以及CPP文件 Sensor 文件路径&#xff1a;…

搭建Nextcloud私有云 - 零基础搭建私有云盘并内网穿透远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

Python网页开发(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.5.31 最早更新时间&#xff1a;2023.5.31 文章目录 1. 项目实例2. flask包2. Django包3. mod_wsgi包 flask和Django等包是用来写网站的&#xff0c;但这些包构建的网站直接运行是不稳定的&#xff0c;所以需要Apa…

软件设计师(中级)全过程总结

软考总结目录 宏观  学习感受  阶段划分 微观  1.自己看书和看视频&#xff1a;  2.学习的知识点和课后题进行结合  3.做往年的软考真题  4.提炼出相对来说难以攻克的问题组织分享和讨论  5.小组讨论做错的题并进行结构化 总结学习时间上学习方法上学习形式上 宏…

86.建立主体页面-第二部分

上一节我们的基础的页面已经生成了&#xff0c;页面如下&#xff1a; ● 接着我们来编写标题的样式&#xff0c;标题的调整可以根据自己的需求来调整&#xff0c;我这里就直接写 .heading-primary {font-size: 5.2rem;font-weight: 700;line-height: 1.05;color: #333;lette…

一般测试用例执行过程的四个步骤

一般测试用例执行过程的四个步骤 测试用例的执行过程是软件测试中非常重要的一环&#xff0c;它可以有效验证软件是否符合预期的功能和性能要求&#xff0c;进而保证软件的质量和稳定性。一般来说&#xff0c;测试用例的执行过程可以分为四个步骤&#xff1a; 第一步&#xff1…

【C++】struct 和 class 的区别

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快。时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 在 C 中&#xff0c;struct 和 class 唯一的区别就在于 默认的访问权限不同。区别如下&#xff1a; …

STM32调试功能

文章目录 STM32调试功能1.硬件接口图2.调试原理3.引脚分配4.调试接口使用方式5.芯片配置 STM32调试功能 1.硬件接口图 2.调试原理 Cortex-M内核&#xff08;M0/M3/M4/M7等&#xff09;包含用于高级调试功能的硬件。利用这些调试功能&#xff0c;可以在取指&#xff08;指令断…

设计模式之~命令模式

定义&#xff1a; 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 为什么需要命令模式? 在我们的软件开发系统中…

100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…

Web的基本漏洞--SSRF漏洞

目录 一、SSRF漏洞介绍 1.SSRF漏洞原理 2.SSRF漏洞经常存在的位置 3.攻击方式 4.SSRF漏洞危害 5.SSRF漏洞的防范 一、SSRF漏洞介绍 1.SSRF漏洞原理 SSRF&#xff08;服务器端请求伪造&#xff09;漏洞,出现的原因&#xff1a;是因为服务器与服务器之间有一个服务器内网&…