花迹、忆红颜
过去往往总是过不去 留成现在最痛的印记

 

对于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了,这样就可以防止一个空的身份证记录进数据库.
posted on 2012-12-20 14:03  花迹、忆红颜  阅读(207)  评论(0编辑  收藏  举报