1、单向多对一关系映射
- 创建两个entity,分别为Student和Grade
- 创建两张表的映射文件
- 在hibernate的配置文件中添加对象映射文件
- 往表中插入数据
因为我们在配置文件中设置了hbm2ddl.auto为update他会自动为我们创建表并创建好约束。当我们第一次往数据库里插入数据的时候,检测到数据库中没有对应的表,那么就会先创建表在插入数据。
- 查询数据库中student
会自动将对应的grade的数据也查询出来
2、单向一对多
- 在Grade实体类中添加一个set集合
- 修改Grade的映射文件
- 在测试类中进行插入测试
4.在测试类中查询
在这里插入图片描述
3、双向一对多
即一那一边中有多那一边的set,多那一边有一那边的对象。注意二者的配置文件中的关联字段的not—null应该去掉。否则会出现问题。双向的意义就是单向一对多和单向多对一的方法都可以像数据库中插入数据。
4. 级联操作cascade
在双向一对多的学习中,我们发现每次保存对象时,学生对象和年级对象都需要我们持久化到session,既然它们两者有关联关系,可不可以只持久化其中一端,另一端就会自动的被持久化呢,这个属性就是Hibernate的cascade。cascade是多对一、一对多、一对一、多对多各种关系之间的一种级联操作行为。
none:不级联
save-update:保存和更新某一端数据时,另一端的数据可以一起保存和更新
delete:删除的级联 不能在多的一端使用
all:表示所有操作都级联
在工作当中:
在多对一的关系中,多的一端不能操作级联为delete。一般在多的一端设为save-update。
在一对多的关系中,如果一的一端设为delete相关配置时,多的一端不能指明外建为非空
什么是级联
官方解释:必须级联到关联目标的操作,默认情况下没有级联操作。
当Hibernate持久化一个瞬时对象时,在默认情况下,它不会自动持久化所关联的其他临时对象,而是会抛出TransientObjectException
级联的意思是:本实体做了什么事,也要拉上另一个关联的实体,导致另一个实体跟着做事情。就是说我删除了,你也得删除!关联目标,指的是关联的那个实体。
在哪里配置级联呢?
在两个表的关联部分配置cascade属性
-
在Grade的映射文件的set上面配置级联,表示当我们插入Grade的时候,如果有对应的student数据,则一起插入,无需一遍遍执行session.save(student)
-
在Student的映射文件的many-to-one标签中设置cascade属性,表示当插入student的时候如果有对应的grade,也会级联插入
5、维护关系inverse
在双向一对多的学习中,我们总结出维护关系方由多端维护时效率较高,因为DML语句会少执行Update语句,那么为了提高程序效率,我们一般都是将关系维护方设置为多端,这个属性就是Hibernate的inverse。invserse的值是boolean值,该属性只能在一端设置。
什么是维护关系
如果一端的映射文件设置为true,说明映射关系(一对多,多对多等)中让对方来维护关系。如果为false。双方都可以维护关系,默认值是false,并且比如一对多,这个一端,也就是在有集合的这端设置。
维护关系:维护什么关系呢?维护外键的关系,上面已经提到,由多端维护,效率较高
当这里设置了inverse以后,我们只能使用多对一去插入数据,如果使用一对多去插入数据,无法为student表的grade_id字段插入值