Hibernate外键一对一单向和双向关联的理解

来源:互联网 发布:yy协议软件手机版 编辑:程序博客网 时间:2024/06/05 10:07

1、一对一的关联的理解

单向A–>B:意思是A可以访问到B,而B不能访问到A。转换成java应用程序就是A里面有B的引用,而B中没有A的引用

双向A–>B:意思是A可以访问到B,B也可以访问到A。转换成java应用程序就是A里面有B的引用,B里面也有A的引用。

对多的情况也类似,只是把引用换成了list

2、通过实验说明一对一单向外键关联

假设我们有两个类husband和wife(属性都为id和name),他们两者的关系为husband–>wife,在java层面就是husband类中有wife的引用,而wife中没有husband的引用。在数据库层面就是表husband中有一个字段wifeId来装有wife的主键id。

实验过程为首先利用Hibernate帮助我们自动在数据生成具有一对一单向外键关联的两张表husband和wife(初始时表中没有内容)。然后首先在husband中插入一条数据:

insert into husband(id,name,wife_id) values(1,’Russell’,’1’);
执行会报错,而当我们首先在wife表中插入一笔数据后:
insert into wife(id,name) values(1,’Bonnie’);
然后在对husband执行插入操作就会成功

这在程序层面很好理解,husband类中有wife的引用,因此如果想要生成一个husband实例,也就相当于husband中的wife也有一个实例,那么必须首先生成一个对应的wife实例。

3、通过实验说明一对一双向外键关联

在数据库层面,单向关联的表结构和双向关联的表结构是一样的

在初次接触一对一双向关联的时候,在Hibernate的Annotation中必须有一方为@OneToOne(mappedBy=”wife”),在马士兵老师的视频中有着重强调,如果是双向关联,则必设mappedBy。当时心里不是很明白,因为这样生成的表结构和单向关联没有任何区别。下面我们通过实验来说明为什么有双向必设mappedBy。

双向关联中,Husband和Wife类中互有对方的引用,然后在两者的getter方法上都加注解@OneToOne,然后运行生成对应的表。这时候会发现两者表中互相生成了外键。这样问题来了,你会发现无法在任何一张表中插入数据。

因此一对一双向关联和单向关联不同的区别就在于代码的层面,你可以通过Husband找到他对应的Wife,也可以通过Wife找到对应的Husband。但是在数据库中它们两者的表结构相同。

4、结论

1、在Hibernate中,如果有双向关联,必设mappedBy
2、一对一单向和双向关联在表结构层面没有任何区别

原创粉丝点击