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)当配置这些关联关系的时候建议大家直接在表上面,把外
键建好,然后通过后面我们介绍的开发工具直接生成,这样可以减少
自己调试的时间。