快速学习Spring Data JPA -- 第五章JPA多表关联关系(不建议参考)

xl_echo编辑整理,交流学习请加1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!


关联关系注解包括@JoinColumn、@OneToOne、@OneToMany、
@ManyToOne、@ManyToMany、@JoinTable、@OrderBy。

@JoinColumn定义外键关联的字段名称。@JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,单独使用没有意义。

当我们使用这些注解的时候,不难发现一个问题,就是关联的数据会被一起加载,在部分时候会造成性能问题。当然,我们的JPA对于这一块也是做了比较好的处理,那就是JPA的执行模式:延迟加载。

fetch

这是我们以上几个关联关系都拥有的一个属性,它有一下策略:

  • FetchType.EAGER:直接加载
  • FetchType.LAZY:懒加载

这一个是以上几个注解的操作权限

cascade

CascadeType.PERSIST级联新增(又称级联保存);
CascadeType.MERGE:级联合并(级联更新);
CascadeType.REMOVE:级联删除;
CascadeType.REFRESH:级联刷新
CascadeType.ALL:以上四种都是(请谨慎使用)

@OneToOne表示一对一

oneToone一般配置joincolumn使用

//referencedColumnName:参考列名,默认的情况下是列表的主键
//nullable=是否可以为空,
//insertable:是否可以插入,
//updatable:是否可以更新
//columnDefinition=列定义,
//foreignKey=外键
@JoinColumn(name="pet_id",referencedColumnName="id",nullable=false)
private User user;

如果我们设置急加载的时候我们可以在程序中看到,当我们加载这个类的时候,另外关联的类也会被加载出来

@ManyToOne表示多对一

说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。

@Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToMany(casade={CascadeTypeType.ALL})
        @JoinColumn(name="customer_id")
        public Collection<AddressEO> getAddress() {
              return address;
        }
        ....
    }

@ManyToMany表示多对多

//TODO

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

你可能感兴趣的:(JPA)