Hibernate Annotation (Hibernate注解)

本文详细解析了mappedBy在Java持久化映射中的应用,包括其适用场景、工作原理及如何在双向关联中正确使用。通过具体实例展示了Person与IDCard之间的映射关系,强调了拥有方维护关系的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

对于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了,这样就可以防止一个空的身份证记录进数据库.

转载于:https://www.cnblogs.com/wuyulunbi/archive/2012/12/20/hibernate_annotation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值