搞清多表之间的关系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 List
}
@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:级联删除。当删除这个对象的时候,对应的关系对象也被删除。