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

被折叠的 条评论
为什么被折叠?



