关联关系映射是指实体与实体之间关系的映射,映射关系分为如下:
通过注解配置映射关系,实现实体与实体之间关系的映射。自动生成表、外键约束、中间表等内容,实现关联关系映射。
单向多对一是只在多方配置针对一方映射关系映射的配置方式。
在多方的实体类中,配置方式如下:
使用fetch属性配置抓取策略,取值:
FetchType.LAZY:懒加载,关联对象会在用到时才会发起SQL查询;
FetchType.EAGER:立即加载,采用左外连接方式进行多表查询,默认采取。
注意:
为了方便操作,在实体类中,提供了有参构造方法,但顺便也要提供无参构造方法,因为这是JavaBean的规范,也因为很多技术在操作JavaBean时,默认调用无参构造方法。
Employee xiaobai = new Employee(null,"小白","昆明","男",19,null);
Employee xiaohong = new Employee(null,"小红","太原","女",15,null);
Department department = new Department(null, "设计部", "阿芳");
xiaobai.setDept(department);
xiaohong.setDept(department);
em.persist(xiaobai);
em.persist(xiaohong);
em.persist(department);
单向一对多是只在一方配置针对多方映射关系映射的配置方式。
在一方的实体类中,配置方式如下:
注意:
新增一方、多方的代码:
Employee xiaobai = new Employee(null,"小白","昆明","男",19,null);
Employee xiaohong = new Employee(null,"小红","太原","女",15,null);
Department department = new Department(null, "设计部", "阿芳");
xiaobai.setDept(department);
xiaohong.setDept(department);
em.persist(xiaobai);
em.persist(xiaohong);
em.persist(department);
双向多对一是在一方、多方都配置多对一关联关系映射的配置方式。
在双方的配置方式,如前面所示一致。
需要额外考虑的问题是,默认情况,一方、多方都维护依赖关系,一方、多方都会操作外键,导致重复执行UPDATA语句。在JPA的规范中,要求多方来维护关联关系,一方作为被维护方,实现方式如下:
双向一对一是在双方都配置一对一关联关系映射的配置方式。
一对一映射,可以采取主键映射或外键映射,这里采用外键映射。
映射关系由一方维护即可,不需双方都维护。负责维护的一方称为维护端,放弃维护的一方,称为被维护端。
配置方式如下:
双向多对多是在关联的双方的,都维护多对多关联关系映射的配置方式。
在双向多对多关系中,必须指定一个关系维护端,可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系被维护端。
实现方式采用中间表进行维护,中间表不需要创建实体类,通过双方的描述,自动生成中间表。中间表中的记录,记录了双方主键映射关系。
使用方式如下:
@JoinTable(name="中间表名称",
joinColumns=@joinColumn(name=“本类在中间表的外键名",
referencedColumnName=“本类的主键"),
inversejoinColumns=@JoinColumn(name=“对方类在中间表的外键名",
referencedColunName=“对方的主键"))