天天看点

Spring Data JPA 关联关系注解

关联关系注解包括   @JoinColumn、@OneToOne、@OneToMany、 @ManyToOne、@ManyToMany、@JoinTable、@OrderBy。 1. @JoinColumn定义外键关联的字段名称 (1)源码语法如下:

Spring Data JPA 关联关系注解

(2)用法: @JoinColumn主要配合@OneToOne、@ManyToOne、 @OneToMany一起使用,单独使用没有意义。 (3)@JoinColumns定义多个字段的关联关系。 2. @OneToOne关联关系 (1)源码语法如下:

Spring Data JPA 关联关系注解

(2)用法: @OneToOne需要配合@JoinColumn一起使用。 注意 : 可以双向关联,也可以只配置一方,需要视实际需求而定。 【示例】假设一个部门只有一个员工。Department的内容如下

Spring Data JPA 关联关系注解

提示 employee_id指的是Department里面的字段,而 referencedColumnName="id"指的是Employee表里面的字段。   如果需要双向关联,Employee的内容如下:

Spring Data JPA 关联关系注解

当然也可以不选用mappedBy,和下面效果是一样的:

Spring Data JPA 关联关系注解

3. @OneToManyg与@ManyToOne关联关 系 @OneToMany与@ManyToOne可以相对存在,也可只存在一方。

(1)@OneToMany源码语法如下:

Spring Data JPA 关联关系注解

@ManyToOne与OneToMany的源码稍有区别,仔细体会。

(2)使用示例,必须和@JoinColumn配合使用才有效。

Spring Data JPA 关联关系注解

4. @OrderBy关联查询时排序

一般和@OneToMany一起使用。

(1)源码语法如下:

Spring Data JPA 关联关系注解

(2)用法示例:

Spring Data JPA 关联关系注解

5. @JoinTable关联关系表

如果对象与对象之间有一个关联关系表的时候,就会用到 @JoinTable,一般和@ManyToMany一起使用   (1)源码语法如下:  

Spring Data JPA 关联关系注解

  (2)假设Blog和Tag是多对多的关系,有一个关联关系表blog_tag_relation,表中有两个属性blog_id和tag_id,那么Blog实体里面的写法如下:  

Spring Data JPA 关联关系注解

  6. @ManyToMany关联关系   (1)源码语法如下:  

Spring Data JPA 关联关系注解

  @ManyToMany表示多对多,和@OneToOne、@ManyToOne一样也有单 向、双向之分。单向双向和注解没有关系,只看实体类之间是否相互引用。   (2)示例:一个博客可以拥有多个标签,一个标签也可以使用在多个博客上,Blog和Tag就是多对多关系。  

Spring Data JPA 关联关系注解

  提示  BlogTagRelation为中间关联关系表blog_tag_relation对应的实体。   7. Left join、Inner join与@EntityGraph        Left join与Inner join       当使用@ManyToMany、@ManyToOne、@OneToMany、@OneToOne关联关系的时候,FetchType怎么配置LAZY或者EAGER。SQL真正执行的时 候是由一条主表查询和N条子表查询组成的。这种查询效率一般比较 低下,比如子对象有N个就会执行N+1条SQL。        @EntityGraph         JPA 2.1推出来的@EntityGraph、@NamedEntityGraph用来提高查 询效率,很好地解决了N+1条SQL的问题。两者需要配合起来使用,缺 一不可。 @NamedEntityGraph配置在@Entity上面,而@EntityGraph配 置在Repository的查询方法上面。我们来看一下实例。   (1)先在Entity里面定义@NamedEntityGraph,其他都不变。其 中,@NamedAttributeNode可以有多个,也可以有一个。  

Spring Data JPA 关联关系注解

  (2)只需要在查询方法上加@EntityGraph注解即可,其中value 就是@NamedEntityGraph中的Name。实例配置如下:  

Spring Data JPA 关联关系注解

  8. 关于关系查询的一些坑   (1)所有的注解要么全配置在字段上,要么全配置在get方法上,不能混用,混用就会启动不起来,但是语法配置没有问题。   (2)所有的关联都是支持单向关联和双向关联的,视具体业务场景而定。JSON序列化的时候使用双向注解会产生死循环,需要人为手动转化一次,          或者使用@JsonIgnore。   (3)在所有的关联查询中,表一般是不需要建立外键索引的。@mappedBy的使用需要注意。   (4)级联删除比较危险,建议考虑清楚,或者完全掌握。   (5)不同的关联关系的配置,@JoinClumn里面的name、referencedColumnName代表的意思是不一样的,很容易弄混,          可以根据打印出来的SQL做调整。   (6)当配置这些关联关系的时候建议大家直接在表上面,把外键建好,然后通过后面我们介绍的开发工具直接生成,这样可以减少自己调试的时间。

继续阅读