Hibernate的关联关系
OneToOne
OneToOne注释提供了5个属性供开发者定义类和类之间一对一关系的细节内容。
- targetEntity
Class类型的属性。
定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。 - mappedBy
String类型的属性。
定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。比如上面的演示场景中,我们只是定义Book类有BookInfo属性,而BookExtend并没有Book属性,那么他们是单向关系,如何BookExtend中也定义了Book属性,那么Book和BookExtend之间就构成了双向关系。 - cascade
CascadeType[]类型。
该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。举个例子:Book和BookInfo有级联关系,那么删除Book时将同时删除它所对应的BookInfo对象。而如果BookInfo还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。
cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。 - fatch
FetchType类型的属性。
可选择项包括:FetchType.EAGER和FetchType.LAZY。前者表示关系类在主类加载的时候同时加载,后者表示关系类在被访问时才加载。默认值是FetchType.EAGER。 - optional
boolean类型的属性。
定义该关联类对是否必须存在。如果设置为false,那么该属性就不能设置为null。默认值是true。
一对多
我们可以使用OneToMany注释来描述类和类之间的一对多关系,OneToMany注释有四个属性:targetEntity、mappedBy、cascade和fetch,这四个属性的具体含义和OneToOne注释注释的同名属性一一对应,请大家参考前面章节中的内容。
多对一
我们可以使用ManyToOne注释来描述类和类之间的多对一关系,ManyToOne注释有四个属性:targetEntity、cascade、fetch和optional,这四个属性的具体含义和OneToOne注释注释的同名属性一一对应,请大家参考前面章节中的内容。
多对多
我们可以使用ManyToMany注释来描述类和类之间的多对多关系,ManyToMany注释有四个属性:targetEntity、mappedBy、cascade和fetch,这四个属性的具体含义和OneToOne注释注释的同名属性一一对应