搞清多表之间的关系

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多表之间的关系操作总结

经典例子:

一对一:身份证号码与人

一对多:城市与大学,订单与订单项,部门与员工,班级与学生等等。

多对一:一对多的反面。订单项与订单,大学与城市,员工与公司,学生与班级。多对多:学生与老师

一对多:单向、双向。

一对多关系中单向与双向的区别:

单向体现在程序中就是你可以通过一方得到另一方,但不能通过另一方得到这一方双向就是彼此都能得到对方,相互都有关于对方的一个引用。(外键)

什么时候需要用单向,什么时候需要用双向。

网友答:

只需要从一方获取另一方的数据时就使用单向关联

双方都需要获取对方数据时就使用双向关系

部门---人员

使用人员时

如果只需要获取对应部门信息(user.getDeptarment())

不需要从部门下的人员信息时,就配置成单向多对一

使用部门时

如果只需要获取部门下人员信息(deptartmanet.getUsers())

不需要从人员获取部门信息时,就配置成单向一对多

既要获取部门下人员 deptartmanet.getUsers()

又要从人员获取部门信息 user.getDeptarment()

那就配置成双向一对多,也就是双向多一

看需求来配置了。

单向多对一”、“单向一对多,其实概念一样,记得在多的一端配置

双向一对多就是两边都要配,做到你中有我我中有你

弄清楚:关系维护端和关系被维护端。

1—m:多的一方是关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键字段。

不管是一对多,还是多对一,外键一定建在多的那方。外键一定是另一张表中已经存在的主键。

关于@mappedBy和@JoinColumn

表示声明一对多关系由对方维护,自己将不再维护,就算在自己这端设置值,保存到数据库后外键依然是null

@mappedBy注解的作用:在JPA中,在@OneToMany里加入mappedBy属性可以避免生成一张中间表。

网上:

a)只有OneT oOne,OneT oMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;

b)mappedBy标签一定是定义在the owned side(被拥有方,也叫关系被维护端,即一的一方),他指向theowning side(拥有方,也叫关系维护端,即多的一方);

c)关系的拥有方负责关系的维护,在拥有方建立外键。所以用到@JoinColumn

d)mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinT able总是失效的,不会建立对应的字段或者表。

@JoinColumn所在实体是关系拥有方,name的值即拥有方对应表到参考表的外键名称。@ mappedBy所在实体是关系的被拥有方,value值owner中表示被拥有类的属性。

举例子:创建两个实体类

一对多时,建立实体类时:一的一方需要一个Set或者List集合存储多的对象,多的一方需要定义一个一的对象。需要设置外键的一方需要加上@JoinColoumn注解。

例子:

城市与大学:一对多

@Entity

@Table(name = "city")

public class City

{

@Id

@GeneratedValue

private Integer id; //城市Id

private String name;//城市名

@OneToMany(mappedBy="city")

@Cascade(CascadeType.ALL)

private Listcollege;

}

@Entity

@Table(name = "college")

public class College

{

@Id

@GeneratedValue

@Column(length = 10)

private Integer id;//大学Id

@Column(length = 20)

private String name;//大学名称

@OneToOne

@JoinColumn(name = "city_id")//外键

private City city;

}

级联设置CascadeType

ALL:包含下面四种

MERGE:级联更新,级联合并。对多的一方进行操作时,对一的一方也进行更新。PERSIST:级联持久化,级联保存:保存一的对象的时候,也对多的对象进行保存。REFRESH:级联刷新:当开始获取这条记录,在处理过程中被另一个程序修改了,这时候调用的就不是最新的记录,需要级联刷新一下。

REMOVE:级联删除。当删除这个对象的时候,对应的关系对象也被删除。

相关文档
最新文档