一、inverse属性
1、Inverse属性,是在维护关联关系的时候起作用的。
表示控制权是否转移。(只在一的一方起作用(本例中为Dept),多的一方无法使用)
<!--
Dept.hbm.xml
inverse=false set集合映射的默认值,表示有控制权
-->
<set name="emps" inverse="false">
<key column="dept_id"></key>
<one-to-many class="Employee"/>
</set>
2、Inverse中文意思:控制反转。
1)Inverse = false 不反转;当前方有控制权
2)Inverse = true 控制反转; 当前方没有控制权
3、维护关联关系中,是否设置inverse属性:
1)对保存数据有无影响?
有影响:如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL。
2)对获取数据有无影响?
无影响。
3)对解除关联关系有无影响?
有影响。
inverse=false, 可以解除关联。
inverse=true, 当前方(部门)没有控制权,不能解除关联关系。
(不会生成update语句,也不会报错)
4)删除数据对关联关系有无影响?
有影响。
inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据。
inverse=true, 没有控制权: 如果删除的记录有被外键引用,会报错,违反主外键引用约束! 如果删除的记录没有被引用,可以直接删除。
二、cascade级联操作
1、取值
1)ascade 表示级联操作 【可以设置到一的一方或多的一方】
2)none 不级联操作, 默认值
3)save-update 级联保存或更新
4)delete 级联删除
5)save-update,delete 级联保存、更新、删除
6)all 同5)。级联保存、更新、删除
2、举例:
1)Dept.hbm.xml
<set name="emps" cascade="save-update">
<key column="dept_id"></key>
<one-to-many class="Employee"/>
</set>
2)测试类:App4_cascade.java
package sram.oneToMany;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App4_cascade {
public static SessionFactory sf;
static{
sf = new Configuration()
.configure()
.addClass(Dept.class)
.addClass(Employee.class)//测试使用
a)级联保存:
b)级联删除:
//2.级联删除
@Test
public void delete(){
Session session = sf.openSession();
session.beginTransaction();
Dept dept = (Dept) session.get(Dept.class, 1);
session.delete(dept);//级联删除,使用的很少,
//一般都通过自己书写程序控制,而不是配置做到级联删除。
session.getTransaction().commit();
session.close();
}
三、hibernate常见面试题: inverse与cascade区别?