JPA中实现双向一对一的关联关系
场景
JPA入门简介与搭建HelloWorld(附代码下载):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
JPA中实现单向多对一的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103511623
JPA中实现单向一对多的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103520083
JPA中实现双向一对多的关联关系:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103523564
按照上面的流程实现以上映射关系后,怎样在JPA中实现双向一对一的映射关系。
比如部门与经理就是双向一对一的关系。
注:
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
为了构造出双向一对一的关联关系,新增经理和部门两个数据库表和实体类。
新建数据库表JPA_MANAGERS经理表

设计部门表JPA_DEPARTMENTS

然后新建部门实体类Department
package com.badao.jpa.helloworld; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table; @Table(name="JPA_DEPARTMENTS")
@Entity
public class Department { private Integer id;
private String deptName; private Manager mgr; @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="DEPT_NAME")
public String getDeptName() {
return deptName;
} public void setDeptName(String deptName) {
this.deptName = deptName;
} //使用 @OneToOne 来映射 1-1 关联关系。
//若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 1-1 关联关系, 所以需要添加 unique=true
@JoinColumn(name="MGR_ID", unique=true)
@OneToOne(fetch=FetchType.LAZY)
public Manager getMgr() {
return mgr;
} public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
注:
1.使用 @OneToOne 来映射 1-1 关联关系。
2.若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 1-1 关联关系,
所以需要添加 unique=true。
3.这里是双向的一对一映射,所以要选择一方作为维护主要关联关系的一方添加@JoinColumn(name="MGR_ID",
unique=true)
然后再新建经理实体类
package com.badao.jpa.helloworld; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table; @Table(name="JPA_MANAGERS")
@Entity
public class Manager { private Integer id;
private String mgrName; private Department dept; @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} @Column(name="MGR_NAME")
public String getMgrName() {
return mgrName;
} public void setMgrName(String mgrName) {
this.mgrName = mgrName;
} //对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy=另一方外键
@OneToOne(mappedBy="mgr")
public Department getDept() {
return dept;
} public void setDept(Department dept) {
this.dept = dept;
}
}
注:
1.对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置
mappedBy=另一方外键。
2.因为此方不维护关联关系,所以直接使用@OneToOne的mappedBy属性,属性值对应的是另一方的外键属性名。
然后在配置文件persistence.xml中添加实体类的配置
<class>com.badao.jpa.helloworld.Manager</class>
<class>com.badao.jpa.helloworld.Department</class>
添加位置如下

然后编写单元测试方法
@Test
public void testOneToOnePersistence(){
Manager mgr = new Manager();
mgr.setMgrName("M-BB"); Department dept = new Department();
dept.setDeptName("D-BB"); //设置关联关系
mgr.setDept(dept);
dept.setMgr(mgr); //执行保存操作
entityManager.persist(mgr);
entityManager.persist(dept);
}
注:
双向 1-1 的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 UPDATE
语句。
运行单元测试方法后查看数据库表
经理表

部门表

JPA中实现双向一对一的关联关系的更多相关文章
- JPA中实现双向多对多的关联关系(附代码下载)
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- 9、JPA_映射双向一对一的关联关系
双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...
- JPA中实现双向一对多的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- JPA(七):映射关联关系------映射双向多对一的关联关系
映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone; import java.util.Date; import java. ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- JPA学习---第九节:JPA中的一对多双向关联与级联操作
一.一对多双向关联与级联操作 1.创建项目,配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> < ...
- JPA学习笔记(8)——映射双向一对多关联关系
双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...
- JPA中关联关系(OneToOne、OneToMany、ManyToMany,ManyToOne)映射代码片段
在使用Hibernate的时候我们常常会在类里边配置各种的关联关系,但是这个并不是很好配置,配置不当会出现各种各样的问题,下面具体来看一下: 首先我们来看User类里边有一个IdentityCard类 ...
- Hibernate双向一对多、双向多对多关联关系中的映射文件怎么写
这里以一对多关联关系为例.以Country类为一端,Competition类为多端. 一个国家可以有多个赛事,但是一个赛事只能属于一个国家. Country类 public class Country ...
随机推荐
- Python使用场景和应用领域
Python特点 1.Python使用C语言开发,但是Python不再有C语言中的指针等复杂的数据类型. 2.Python具有很强的面向对象特性,而且简化了面向对象的实现.它消除了保护类型.抽象类.接 ...
- centos7环境搭建一台mysql服务器启动多个端口
在一台服务器上启动多个mysql实例,分别用不同的端口号,因centos7版本安装mysql5.7后不存在mysqld_multi .mysqld_safe等命令,做踩坑总结 Mysql多实例实现的3 ...
- 批量更新Linux文件后缀名
#!/bin/bash#Create_Time 2019-08-06#use: small_wei #查找并,批量修改文件后缀 #后缀为 .txt 修改为 .log find /opt -name & ...
- JS&jQuery
1.JavaScript概述 1.什么是JavaScript JavaScript简称JS,是一种专门运行于JS解释器/引擎中的解释型脚本语言 2.JS发展史 ...
- TypeScript躬行记(1)——数据类型
TypeScript不仅支持JavaScript所包含的数据类型,还额外扩展了许多实用的数据类型,例如枚举.空值.任意值等. 一.JavaScript的数据类型 JavaScript的数据类型包括6种 ...
- 使用 SecureRandom 产生随机数采坑记录
公众号「码海」欢迎关注 背景 我们的项目工程里经常在每个函数需要用到 Random 的地方定义一下 Random 变量(如下) public void doSomethingCommon() { Ra ...
- Vue3.0常用代码片段和开发插件
Vue3 Snippets for Visual Studio Code Vue3 Snippets源码 Vue3 Snippets下载 This extension adds Vue3 Code S ...
- 深入理解Android异步消息处理机制
一.概述 Android 中的异步消息处理主要分为四个部分组成,Message.Hndler.MessageQueue 和 Looper.其关系如下图所示: 1. Message 是线程之间传递的消息 ...
- 这个立冬,我线下面基了一位TMD高级专家,太牛逼了!
立冬刚过,迎面而来的是一股寒气.天气如此,市场亦是如此.昨天周五,和1个认识的技术专家老刘约饭,也算是线下面基,增进感情.每年我都要向比我高阶的朋友讨教.不由自主聊到了他的职场生涯.鱼哥一直以为自己命 ...
- SX1276/SX1278和SXSX1262的详细参数对比
SX1276/SX1278和SX1262的对比 SX1262是Semtech公司新推出的一款sub-GHz无线收发器.SX1262芯片最大的买点是它的低功耗和超远距离的传输.SX1262接收电流 ...