jpa实体映射关系

引:其实距离自己上次写数据库操作已经1个多月了,之前接触的就是Hibernate,这次接触jpa,就把几种对应关系理清。

映射策略

注:这次举的例子都是User和Car的

外键关联

简介:两个表的关系定义在其中一个表中

@OneToOne

方法一:

1
2
3
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "user_id")
private Car car;

通过在Car表中加入一个外键,实现两者关系。
方法二:

1
2
@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "Car")
private User user;

通过在Car类中用MappedBy声明让User进行维护。

@OneToMany

1
2
3
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "user_id")
private Set<Car> cars;

通过在Car表中加入一个外键,实现一对多关系。

@ManyToMany

1
2
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Set<Car> cars;

这个是采用默认的表关联

表关联

简介:两个表的关系通过一张中间表来来关联

@OneToMany

1
2
3
4
5
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "user_car",
joinColumns={@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "car_id")})
private Set<Car> cars;

通过JoinTable来确定一张中间表,joinColumns里面放父表的属性,inverseJoinColumns放子表的属性

@ManyToMany

1
2
3
4
5
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "user_car",
joinColumns={@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "car_id")})
private Set<Car> cars;

解释如@OneToMany

一些属性

cascade属性

  1. CascadeType.PERSIST:级联新建
  2. CascadeType.REMOVE:级联删除
  3. CascadeType.REFRESH:级联刷新
  4. CascadeType.MERGE:级联更新
  5. CascadeType.ALL:包括上面四项

fetch属性

  1. FetchType.EAGER:相当于禁用懒加载,推荐开发使用
  2. FetchType.LAZY:懒加载,默认值,推荐部署使用

总结

父表是提供主键的,子表是利用父表的主键来设置外键的,维护方是Owner,被维护方是Owned。提示自己一个傻逼的问题,插入数据要先往两张表中插入数据,在往中间表插入数据,不然会报错~