基础5-关联查询

本文详细解析了在Java持久化API(JPA)中如何映射不同类型的关联关系,包括单向多对一、单向一对多、双向多对一、双向一对一及双向多对多的关联关系,阐述了每种关系在表结构设计、实体类注解、增删查改操作上的具体实现。

映射单向多对一的关联关系

一个A对应多个B,而一个B对应一个A;类似于一个英语老师对应多个学生,而一个学生对应一个英语老师;

这里是站在B的角度去看待这个映射关系;

在设计表结构的时候,那么A表中的主键就是B表中的外键,那么基于JPA时,需要在B表的@Entity实体类上外键实体类的getXXX方法上,分别添加@ManyToOne、@JoinColumn(name=”A表的主键”)

进行新增操作时,先保存A,后保存B,来避免不必要的update语句,因为先插入B的时候外键为空,只能再用update语句来更新外键;

进行查询操作时,使用find方法基于B查询时,其SQL语句大致是这样:B left join A on B.外键=A.主键,即使用左外连接连接B与A;

进行删除操作时,基于B来删除,不能直接删除A表,因为B有外键约束;

进行更新操作时,与普通方式一致;

映射单向一对多的关联关系

一个A对应多个B,而一个B对应一个A;类似于一个英语老师对应多个学生,而一个学生对应一个英语老师;

这里是站在A的角度去看待这个映射关系;

在设计表结构的时候,那么A表中的主键就是B表中的外键,那么基于JPA时,需要在A表的@Entity实体类的集合属性的getXXX方法分别添加@OneToMany、@JoinColumn(name=”A表的主键”)

进行新增操作时,无论是先保存A还是B,都会多出几个update语句,这是因为B是否先执行,B在插入时,不会同时插入外键值,所以,该操作必须多出几个update语句来更新外键;

进行查询操作时,使用find方法基于A查询时,默认对B进行懒加载从策略,可以对@OneToMany注解的fetch属性来修改这种懒加载策略,最后find对应的SQL语句大致是这样:A left join B on B.外键=A.主键,即使用左外连接连接A与B;

进行删除操作时,基于A来删除时,则先把B表的外键置为空,然后再去删除A,可以使用@OneToMany注解的cascade属性来修改这种默认行为,cascade={CascadeType.REMOVE}来把从表B,主表A一起删除记录;

进行更新操作时,与普通方式一致;

映射双向多对一的关联关系

一个A对应多个B,而一个B对应多个A;类似于一个授课老师对应多个学生,而一个学生对应多个授课老师;

这里是站在A、B的角度去看待这个映射关系;

对于B来说,那么基于JPA时,需要在B表的@Entity实体类的外键实体类的getXXX方法上添加@ManyToOne、@JoinColumn(name=”A表的主键”);

对于A来说,那么基于JPA时,需要在A表的@Entity实体类的集合属性的getXXX方法分别添加@OneToMany、@JoinColumn(name=”A表的主键”)

进行新增操作时,无论是先保存A还是B,都会多出几个update语句,因为无论谁先执行,在插入时,不会同时插入外键值,所以,该操作必须多出几个update语句来更新外键,建议由多的一方维护关联关系,来减少update语句,这里可以在1的一方的@OneToMang注解的mappedBy属性来强制达到这一点,由于使用该属性,那么就删掉上面的@JoinColumn注解;

映射双向一对一的关联关系

一个A对应一个B,而一个B对应一个A;类似于一个人只有一个身份证号码,一个身份证号码对应一个人;

由于是一对一映射,因此,外键放在A、B均可,这里就放在B里面;

对于B来说,那么基于JPA时,需要在B表的@Entity实体类的外键实体类的getXXX方法上添加@OneToOne、@JoinColumn(name=”A表的主键”,unique=true);

对于A来说,那么基于JPA时,需要在A表的@Entity实体类的外键实体类的getXXX方法上添加@OneToOne(mapppedBy=“B表@Entity实体类外键实体属性名”)来表示A不维护映射关系,避免不必要的update数据;

进行新增操作时,先保存A,后保存B,因为先保存B的时候,B的外键是空的,只能再用update更新B的外键;

进行查询操作时,在基于B来查询时,则会对B使用left join来同时获取B和A,可以通过B 的@OneToOne注解的fetch=FetchType.LAZY属性来避免这种左外连接;

进行查询操作时,在基于A来查询时,则都会使用left join来同时获取B和A,此时, 对A不建议使用@OneToOne注解的fetch=FetchType.LAZY属性,因为你在A上使用了fetch属性之后,JPA会把一个left join拆分成2个select语句来操作;

映射双向多对多的关联关系

多对多时,将分别使用如下注解:@JoinTable(name,joinColumns,inverseJoinColumns)、@ManyToMany;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值