Hibernate注解(三)关系映射级别注解

一、关系映射级别注解

1、一对一单向外键关联

2、一对一双向外键关联

3、一对一单向外键联合主键

4、多对一单向外键关联

5、一对多单向外键关联

6、一对多双向外键关联

7、多对多单向外键关联

8、多对多双向外键关联

二、实体之间的映射关系

一对一:一个公民对应一个身份证号码

一对多(多对一):一个公民有多个银行帐号

多对多:一个学生有多个老师,一个老师有多个学生。

三、一对一单向外键关联

(1)@OneToOne(cascade=CascadeType.ALL):参数为级联关系

(2)@JoinColumn(name="xx",unique=true):参数name为被控类主键,unique标识该主键唯一

xx是被控类的主键,主控类的外键

注意:保存时应该先保存外键对象,再保存主表对象

(1)新建一个工程RelationshipAnnotation,导入包

Hibernate注解(三)关系映射级别注解_第1张图片

(2)实体类

Hibernate注解(三)关系映射级别注解_第2张图片
Hibernate注解(三)关系映射级别注解_第3张图片

(3)hibernate的配置文件

Hibernate注解(三)关系映射级别注解_第4张图片

(4)创建测试类,输出表结构

Hibernate注解(三)关系映射级别注解_第5张图片

(5)控制台的打印

Hibernate注解(三)关系映射级别注解_第6张图片

(6)表结构

身份证表

Hibernate注解(三)关系映射级别注解_第7张图片

学生表

Hibernate注解(三)关系映射级别注解_第8张图片
Hibernate注解(三)关系映射级别注解_第9张图片
Hibernate注解(三)关系映射级别注解_第10张图片

(7)增加一条记录

Hibernate注解(三)关系映射级别注解_第11张图片
Hibernate注解(三)关系映射级别注解_第12张图片

四、一对一双向外键关联

Hibernate注解(三)关系映射级别注解_第13张图片
Hibernate注解(三)关系映射级别注解_第14张图片

其他的跟一对一单向一样

Hibernate注解(三)关系映射级别注解_第15张图片

五、一对一双向外键联合主键

创建主键类

主键类必须实现serializable接口,重写hashCode()和equals方法。

主键类:@Embeddable

实体类:@EmbeddedId

具体实现步骤请参考第二章内容

六、多对一单向外键关联

多方持有一方的引用,比如:多个学生对应一个班级(多对一)

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

@JoinColumn(name = "cid", referencedColumnName = "CID")

要知道@JoinColulmn是干什么的,@ManyToOne只是定义了一种关系,以及关系的维护,但并未指明建立关系的对应列,所以@JoinColumn中的name为当前类的属性名,(多对一单向,有多方维护)所以,name为student中的cid,而ReferenceColumnName为引用表的列(多对一单向,所以为一方的引用列)即ClassRoom中的主键列

Hibernate注解(三)关系映射级别注解_第16张图片
Hibernate注解(三)关系映射级别注解_第17张图片
Hibernate注解(三)关系映射级别注解_第18张图片
Hibernate注解(三)关系映射级别注解_第19张图片

新增一条记录

缺少这个

Hibernate注解(三)关系映射级别注解_第20张图片

加上这个就可以了

重新新增

Hibernate注解(三)关系映射级别注解_第21张图片
Hibernate注解(三)关系映射级别注解_第22张图片

七、一对多单向外键关联

一方持有多方的集合,一个班级有多个学生(一对多)

@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)

JoinColumn(name="cid"):此处中的name为设定多方中外键的列名

Hibernate注解(三)关系映射级别注解_第23张图片
Hibernate注解(三)关系映射级别注解_第24张图片
Hibernate注解(三)关系映射级别注解_第25张图片
Hibernate注解(三)关系映射级别注解_第26张图片
Hibernate注解(三)关系映射级别注解_第27张图片

八、一对多(多对一)双向外键

Hibernate注解(三)关系映射级别注解_第28张图片

以上保持不变

Hibernate注解(三)关系映射级别注解_第29张图片
Hibernate注解(三)关系映射级别注解_第30张图片
Hibernate注解(三)关系映射级别注解_第31张图片

九、多对多单向外键关联

学生和教师构成多对多的关联关系

其中一个多方持有另一个多方的集合对象(学生持有教师的集合)

创建中间表

学生(有外键)为主控方,教师(配置主键及生成策略)为被控方。

在学生表中的教师集合上加注解,

@ManyToMany

@Jointable(name="teachers_students"

joinColumns={@joincolumn(name="sid")},

inverseJoinColumns={@JoinColumn(name="tid")}

Hibernate注解(三)关系映射级别注解_第32张图片
Hibernate注解(三)关系映射级别注解_第33张图片
Hibernate注解(三)关系映射级别注解_第34张图片
Hibernate注解(三)关系映射级别注解_第35张图片
Hibernate注解(三)关系映射级别注解_第36张图片
Hibernate注解(三)关系映射级别注解_第37张图片
Hibernate注解(三)关系映射级别注解_第38张图片
Hibernate注解(三)关系映射级别注解_第39张图片

新增记录

Hibernate注解(三)关系映射级别注解_第40张图片
Hibernate注解(三)关系映射级别注解_第41张图片

十、多对多双向外键关联

(1)双方持有对方的集合对象,其中一方设置

@ManyToMany(mappedBy="teachers")这里指的是映射的属性名(在主控类student中),正是通过这个这个属性才最终完成了双向映射。将主控方交给学生来处理,相当于把控制权抛出。

根据上面的多对多单向外键关联的案例,只需在teacher实体类加上student集合属性,再在上面添上如下注解,就可以实现多对多双向外键关联了。其他保持不变。

Hibernate注解(三)关系映射级别注解_第42张图片

你可能感兴趣的:(Hibernate注解(三)关系映射级别注解)