搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
我家自动化
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
浏览器Edge下载文件显示不安全下载不了_无法安全下载 edge
2
一文看尽297篇文献!中科院领衔发表首篇「基于扩散模型的图像编辑」综述_awesome 图像编辑
3
用1片3-8译码器74LS138和必要的门电路设计一个多输出的组合电路. 要求写出设计过程, 画出连线图. 输出的逻辑函数为: Y1(A,B)=∑m(0,3), Y2(A,B)=∑m(1,2,3)_用74ls138设计多输出组合逻辑电路
4
详解android.mk中引用第三方库的方法_android.mk使用第三方提供的库
5
adobe全家桶,PS下载安装教程(附赠各版本安装包)_ps下载安装教程csdn
6
基于springBoot实现民宿管理平台系统源码_基于springboot的民宿管理系统
7
缺少对API接口的安全控制:API接口未得到适当的安全保护和监控
8
MySQL高级查询操作_查询图书价格最高的图书名称(子查询)
9
chatglm-6b,搭建自己的AI模型_chatglm 自定义模型
10
【Python】StableDiffusion文生图_python 使用本地stable-diffusion大模型,根据提示词生成图片
当前位置:
article
> 正文
【JPA】 @OneToOne 一对一单向关联注解_jpa 注解 一对一
作者:我家自动化 | 2024-05-03 18:13:19
赞
踩
jpa 注解 一对一
原文请点击此处
@OneToOne 定义:一对一关系。
生活中的一对一关系,举例:人(man) 和 宠物(pet)。前提(一人只养一个宠物)
为什么这个一对一关系是单向的?如果,人养了宠物,那么我们通过“人”就能得到他所拥有的“宠物”的实体。但是,是不是通过“宠物”就能得到“人”的实体呢?!恐怕未必吧~因为在实际生活中,有很多走失的宠物,我们无法通过它们找到它们的主人。
类似于上述这种情况,或者业务关系。实体间的关系是一对一,并且,我们只需要通过一个实体得到其对应的实体,而且并不需要反向执行这个操作的时候。我们就需要使用单向一对一关系。
例子:
@Entity
@Table(name = "people")
public class People (){
@Id
//JPA注释:
主键
@GeneratedValue(strategy = GenerationType.AUTO)
//设置 id 为自增长
private Long id;
private String name;
//由于,people 是这个一对一的关系的主控方,所以,在people表中添加了一个 pet 的外键。
//通过这个外键来维护 people和pet的一对一关系,而不是用第三张码表。这个是通过
@JoinColumn注释实现的。
@OneToOne
//JPA注释:
一对一 关系
@JoinColumn(name="pet_fk" )// 在pepole中,添加一个外键
"
pet_fk
"
private Pet pet;
//省略 get / set
方法...
}
@Entity
@Table(name = "pet")
public class Pet (){
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
//省略 get / set
方法...
//因为这是一个单向的一对一关系,并且,是从 people 到 pet 的一对一关系。
//所以,在 pet 中没有与 people 管理的 属性。也就是说,无法通过 pet 找到 people
}
===========================测试====================================
//省略包的引用...
PeopleDao , PetDao
public class TestSingleSideOneToOne (){
//测试方法
创建----实体(人&宠物)
public void testCreate(){
//创建人
People people = new People();
people.setName("人");
//创建宠物
Pet bird = new Pet();
bird
.setName("鸟");
petDao.save(
bird
);
Pet cat = new Pet();
cat
.setName("猫");
petDao.save(
cat
);
Pet dog = new Pet();
dog
.setName("狗");
petDao.save(
dog
);
//此时,有了人,也有了宠物,我们终于可以让这个人领养他的宠物了。
//就让他领养一只小
狗
吧
people.setPet(
dog
);
p
eopleDao.save(people);//保存people实体。
//让我们来验证一下
People testPeople =
p
eopleDao.findByName("人");
//得到这个人养的宠物,并调用宠物get方法,得到宠物的名字
String petName = testPeople.getPet().getName();
System.out.println(
petName
);//打印的结果必然是
“狗”
}
//测试方法2
删除--- 实体(人)
public void testDeletePeople(){
//得到名字叫“人”的 人 的 实体
People people =
p
eopleDao.findByName("人");
//删除实体(人)
p
eopleDao.delete(people);
//在方法执行过后,人这个实体被从数据库中删除了。
但是,宠物的实体还存在,并没有受到任何的影响。因为,people 和 pet 是单向的一对一关系。
删除人,当然不会对宠物实体造成任何影响。那么,如果我们想要删除宠物,结果还会是一样的么?请看下一个测试方法。
}
//测试方法3
删除----实体(宠物:鸟)
public void testDeleteBird(){
//得到名字叫“鸟”的 宠物 的 实体
Pet
pet =
p
etDao.findByName("鸟");
//删除实体(宠物:鸟
)
p
etDao.
delete(pet);
//验证方法
List<Pet> pets = petDao.findAll();//得到全部的宠物实体集合
if(pet != null){
for(int i=0;i<pets.size();i++){
Pet pet = pets.get(i);//得到当前循环的宠物实体
System.out.println(
pet.getName()
);//打印宠物的名字
}
}
//当方法执行结束后,你会看到
"狗"
“猫” 被打印出来了。而,“鸟”的实体,已经从 表pet中被删除掉了。是不是删除每一只宠物都如此简单顺利呢?恐怕未必吧。还记得那句话么?
“打狗也得看主人啊~”
}
//测试方法4
删除----实体(宠物:狗)
//这个方法执行后,会产生异常
public void testDeleteDog(){
//得到名字叫“狗”的 宠物 的 实体
Pet
pet =
p
etDao.findByName("狗");
//删除实体(宠物:狗
)
p
etDao.
delete(pet);
//为什么会产生异常呢?因为你只是删除了宠物这个实体,但是却没有解除关系(在people表中的外键pte_fk 还是 “狗”)。JPA不会自动的去解除关系。这是缺点,也是它的有点。可以在正常删除的时候,通过捕获异常,来达到一些业务操作。就像刚刚这种情况,在你想要删除 宠物的时候,发生了异常,就说明 有人正在饲养这只小狗。这不是被遗弃的宠物,你无权处理它。除非,它被抛弃了(关系维护端,人,解除了关系。人 实体中的pet 属性置空,关系解除。)
//那么让我们继续往下看,看看如何正确的,删除掉宠物实体。
}
//测试方法4
删除----实体(宠物:狗)
//在方法开始前,我会告诉你。在一对一单向关系中,没有添加级联删除操作。并且还想删除 被维护端。这是一个多么不理智的行为啊。那么,随后,你就知道我为什么会这么说了。
public void testDeleteDog2(){
//得到名字叫“狗”的 宠物 的 实体
Pet
dog =
p
etDao.findByName("狗");
//首先,我们要得到全部人的集合
List<People> peoList = peopleDao.findAll();
//省略空值校验
for(int i=0;i<peoList.size();i++){
People peo = peoList.get(i);
//
看看谁养了这只小狗。我们要强迫他抛弃自己的小狗。
if(peo.getPet() == dog){
//让他抛弃他的小狗。(从维护端解除关系)
peo.setPet(null);
//为什么保存“人”实体的操作会被注释掉呢?在置空操作后,不需要保存么?这就是JPA。只要你关系设置的正确,许多操作它都会替你完成。当小狗被删除后,小狗主人的对于属性已经是置空状态了。
//peopleDao.save(peo);
return null;
}
}
//删除实体(
宠物:狗
)
p
etDao.
delete(
dog
);//至此,那个可怜的主人,如果你想的话,你还可以重新领养一只“猫”。
//省略验证方法
//小狗被成功删除
}
}
在进行了,循环查找,解除关系的操作后,我们终于把这只小狗从 表pet 中删除了。但是,为了删除这只狗,我们都付出了什么。一个循环操作查找谁养了这只宠物的操作,浪费了多少资源和性能?
之所以在删除这里,用了这么大的篇幅,就是想向大家强调,选择关系的重要性!!!如果,这是一个双向的一对一关系。那么,我可以直接通过这只小狗找到它的主人,然后让它的主人解除关系。随后就可以轻松的把它删除掉。他的主人随后也可以继续领养其他的宠物。不需要通过繁琐的循环了查找它的主人。
通常情况下,采用 单向一对一关系,会在关系维护端添加上级联删除操作。删除主人的时候,自动删除主人领养的宠物实体。我们不关心宠物实体的维护。它的存在和消亡,应该依赖于自己的主人。当主人不消亡的时候,它也失去了存在的意义。
对于级联操作和其他关系类型。我会再随后的文章里,继续想大家介绍。另外,对于这个不是特别恰当,且冷血的例子,请青少年朋友们,在成人的陪同下一起学习。我们应该热爱小动物。他们应该是双向的,相互关联的,那么,就让我们一起期待
【JPA】@OneToOne 一对一双向关联注解
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/我家自动化/article/detail/530925
推荐阅读
article
SpringBoot-
SpringData
-
oneToOne
_
spring
data
onetoon...
前面说了SpringBoot-
SpringData
-JPA集成 以这个项目为基础,继续
SpringData
的一些功能下面...
赞
踩
article
jpa
onetoone
_
Spring
Data
JPA关系映射@
OneToOne
...
@
OneToOne
, 表示一对一的映射关系,比如一个账号对应一个用户,一个实体用来描述账号的信息(账号,密码,账号是否可...
赞
踩
article
JPA
关系
映射
(
OneToOne
、
OneToMany
、
ManyToMany
)_jpa onetoo...
单向
OneToOne
单向一对一是关联
关系
映射
中最简单的一种,简单地说就是可以从关联的一方去查询另一方,却不能反向查询。...
赞
踩
article
Mybatis
一对
多(
OneToOne
)关系映射
_
mybatisplus
onetoone
...
标签:
Mybatis
一对
多(
OneToOne
)关系映射 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出...
赞
踩
article
Hibernate
@
OnetoOne
注解_
@
onetoone
(
optional
=
false
)...
@
OneToOne详解_
@
onetoone
(
optional
=
false
)
@
onetoone
(
optional
= ...
赞
踩
article
JPA @
OneToOne
@OneToMany @ManyToOne @ManyToMany 描述...
JPA 四种关系描述@
OneToOne
@OneToMany@ManyToOne@ManyToMany@
OneToOne
@...
赞
踩
article
JPA
#
OneToOne
...
无力吐槽。一对一,一个人有一个身份证号码、一个人有一条命,类似于这一种的就是一对一的关系。涉及到的注解两个:OneToO...
赞
踩
article
JPA 使用
@
OneToOne
_
jpa
onetoone
...
OneToOne
,就是一对一映射,现实生活中比较常见的例子就是一个人有一个身份证,一个丈夫只能有一个老婆新建一个Pers...
赞
踩
article
Spring
JPA 联表
查询
之
OneToOne
_
jpa
onetoone
find
实体字段...
前面几篇我们学习的都是单表
查询
,就是对一张表中的数据进行
查询
。而实际项目中,基本都会有多张表联合
查询
的情况,今天我们就来...
赞
踩
article
JPA
@
OneToOne
使用_
jpa
onetoone
...
产品迭代引入
JPA
,记录一下初次使用 @
OneToOne
和遇到的坑。纯实操内容。_
jpa
onetoone
jpa
one...
赞
踩
article
jpa
onetoone
_
Spring
JPA
关系
映射系列教程:
OneToOne
关系
映射详解...
这是
JPA
关系
映射 系列教程的第一篇:
JPA
One-To-One 外键
关系
映射
JPA
关系
映射系列(SPring B...
赞
踩
article
JPA 中
OneToOne
单向级联,实现两个实体
更新
_
jpa
@
onetoone
case
...
折腾了一上午,终于搞定了。 一、有两个实体对象,“任务实例(KuWfRuProcInst)”和“任务实例表单数据(KuW...
赞
踩
相关标签
SpringData
SpringBoot
oneToOne
数据库
jpa onetoone
JPA
Hibernate
关系映射
OneToOne
OneToMany ManyToMany
hibernate
java
spring
json
后端
开发语言
jpa
J2ee
一对一
更新