对于mappedBy复习下:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;
b) mappedBy标签一定是定义在the owned side(被拥有方的/主表/被引用方),他指向the owning side(拥有方/从表/引用方);
c) mappedBy的含义,应该理解为,拥有方(从表)能够自动维护 跟被拥有方(主表)的关系;
当然,如果从被拥有方(主表),通过手工强行来维护拥有方(从表)的关系也是可以做到的。
d) mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方(从表)有一个关联着被拥有方(主表)的字段存在,拥有方(从表)才拥有了被拥有方(主表)。mappedBy这方定义的JoinColumn/JoinTable总是失效的,不会建立对应的字段或者表
人跟身份证双向关联
按着事实逻辑,Person应该是引用方(从表),IDCard是被引用方(主表),将主表中的主键Id拿到从表中当外键,以此建立表间关系,通常在编程中,表间关系都是由从表(拥有方)去维护.
在双向关联中,在主表中设置mappedBy关键字是必须的,表示将表间关系委托给对方(从表)去维护,在从表中设置JoinColumn关键字表示在此表中添加外键列.
在Person(从表/引用方) 里面定义的注解:
@JoinColumn(name="idcard_id")//添加外键列
@OneToOne(cascade={CascadeType.ALL},optional=true)
public IDCard getIdCard() {
return idCard;
}
在IDCard(主表/被引用方) 里面定义的注释:
@OneToOne(cascade=CascadeType.ALL,mappedBy="idCard" , optional=false)
public Person getPerson() {
return person;
}
多了一个mappedBy这个方法,它表示什么呢?它表示当前所在表和Person的关系是定义在Person里面的idCard这个成员上面的,它表示此表是一对一关系中的主表,也就是关系是在person表里面维护的 ,这一点很重要 . Person表是关系的维护者,owner side,有主导权,它有个外键指向IDCard。
我们也可以让主导权在IDCard上面,也就是让它产生一个指向Person的外键,这也是可以的,但是最好是让Person(拥有方/从表)来维护整个关系,这样更符合我们正常的思维 .
我们也可以看到在Person里面IDCard是注释是optional=true,也就是说一个人是可以没有身份证的,但是一个身份证不可以没有人,所以在IDCard里面注释person的时候,optional就为false了,这样就可以防止一个空的身份证记录进数据库.
我说了所有的谎,你全都相信。简单的我爱你,你却老不信。