hibernate入门(9)关联关系中的高级应用_级联操作
1. 级联操作 :
在前面的一对多操作中已经有所体现,现在回到前面的一对多操作中,进行一些修改,修改内容如下:
Set<Employee> emps = new HashSet<Employee>();
emps.add(emp1);
emps.add(emp2);
depart.setEmps(emps);
去掉这段注释,并把“s.save(emp1);
s.save(emp2);
”
注释掉,然后运行发现出错。原因是:当我们保存Department depart
对象时,发现它所关联到的两个Employee
emp
对象并未保存,而这种要依赖别的对象的操作即是级联操作,级联操作主要体现在关联关系中,且是可配置的,只是默认的级联操作是被设为”none”,
而如果我们希望进行级联操作,只需要在<set>
配置中增加cascade
属性,比如我们现在Department.hbm.xml
的<set>
元素下增加
cascade
=
"save-update"
属性后,再来执行会发现正常,原因是Hibernate
进行了级联操作,相当Hibernate
帮我们写了注释掉的“s.save(emp1); s.save(emp2)
”这两句内容。下面列表说明级联操作的可选值。
cascade 属性值 |
功能作用描述 |
none |
在保存、修改对象时,不对与之关联的对象进行任何操作,它作为cascade 默认值。 |
save-update |
当保存或修改对象时,级联保存所有与之关联的临时对象,级联更新所有与之关联的脱管(游离)对象。 |
delete |
当删除时,级联删除所有与之关联的对象 |
all |
包括save-update 和delete 两种行为 |
delete-orphan |
删除所有和本对象解除关联关系的对象,主要表现在“一对多”中。 |
all-delete-orphan |
包括all 和delete-orphan 的行为 |
说明 :(1 )cascade 可以在<set><list><bag><map> 中进行配置,即在“多对一”、“一对多”、“多对多”、“一对一” 这些关联关系中,“级联”都是可配的在一般的对象中不能配置。(2 )可以为其配置多个属性值,中间用逗号分隔。如cascade=”save-update,delete”.(3) 一般只在“一对一 一对多”配置级联,而不会在“多对一 多对多”中配置级联,但在配置时最好的方法是根据实际情况进行配置。现举例说明:比如在“部门和员工”之间,如果我们希望部门取消时,属于该部门的员工并不会被取消,而是分到的别的部门,我们就不应为cascade 配置“delete ”值。