cascade理解起来比较简单就是级联操作(增删改),inverse不是很好理解网上查的资料都是说维护关系用的,这个单词的意思是inverse是“逆,对面的”也就是反过来,inverse=true就是另一方维护的意思,反之就是自己维护,不知道有木有理解错误。。。。网上所说的维护关系,就是维护外键的值。
举个例子吧,有两张表:学校表school和学生表student,一对多的关系,代码和配置文件如下:
public class Student implements Serializable { private String id; private String name; private School school; }
<many-to-one name="school" class="com.bean.School" fetch="join"> <column name="SCHOOL_ID" /> </many-to-one>
public class School { private String id; private String name; private Set<Student> students = new HashSet<Student>(0); //添加学生 public void addStudent(Student s){ students.add(s); } }
//inverse="true"说明让另一方(即STUDENT)来维护STUDENT表中的外键,注意这里的inverse是指Scho//ol,因为这个是School表,这就意味着school不是主控方(主控方才会维护外键关系),不会维护STUDENT表的SCHOOL_ID字段 <set name="students" table="STUDENT" inverse="true" lazy="true" cascade="all-delete-orphan"> <key> <column name="SCHOOL_ID" /> </key> <one-to-many class="com.bean.Student" /> </set>
测试代码如下:
School school = new School(); school.setName("某某高校"); Student s1= new Student(); s1.setName("学生1"); school.addStudent(s1); Student s2= new Student(); s2.setName("学生2"); school.addStudent(s2); session.save(school);
运行结果:
Hibernate: insert into SCHOOL (NAME, ID) values (?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
发送了3条SQL,再来看看数据库STUDENT表的记录
SCHOOL_ID 没有值,因为外键关系school已经不管了,需要student维护,修改测试代码:
School school = new School(); school.setName("某某高校"); Student s1= new Student(); s1.setName("学生1"); school.addStudent(s1); Student s2= new Student(); s2.setName("学生2"); school.addStudent(s2); s1.setSchool(school); s2.setSchool(school); session.save(school);
运行结果:
Hibernate: insert into SCHOOL (NAME, ID) values (?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
也是发送了3条SQL,再来看看数据库STUDENT表的记录
结果说明设置inverse=“true”需要student执行setSchool方法来自己维护外键的关系,如果想让school来维护外键关系,则需要设置inverse=“false”,配置文件如下:
<set name="students" table="STUDENT" inverse="false" lazy="true" cascade="all-delete-orphan">
<key>
<column name="SCHOOL_ID" />
</key>
<one-to-many class="com.bean.Student" />
</set>
测试代码:
School school = new School(); school.setName("某某高校"); Student s1= new Student(); s1.setName("学生1"); school.addStudent(s1); Student s2= new Student(); s2.setName("学生2"); school.addStudent(s2); //s1.setSchool(school); //s2.setSchool(school); session.save(school);
运行结果:
Hibernate: insert into SCHOOL (NAME, ID) values (?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
Hibernate: insert into STUDENT (NAME, SCHOOL_ID, ID) values (?, ?, ?)
Hibernate: update STUDENT set SCHOOL_ID=? where ID=?
Hibernate: update STUDENT set SCHOOL_ID=? where ID=?
额外执行了两次update,说明school维护了外键关系,两次update就是更新外键的,在看看数据库student表:
cascade有四种取值:
none: 默认值,任何情况都不进行关联操作。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all: 所有情况下均进行关联操作,即save-update和delete。
all-delete-orphan: 当一个节点成为孤儿节点时,删除该节点。
这里说明一下设置cascade="all-delete-orphan",就是在执行
school.getStudents().remove(student); student.setSchool(null);
student就成了孤儿节点了,那么hibernate在同步缓存到数据库时就会把对应的记录删除了。
ps:orphan就是孤儿的意思,英语不好伤不起。。。
相关推荐
在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...
在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...
在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...
本篇将深入讲解“cascade”和“inverse”这两个重要的概念,以及它们在实际应用中的作用。 首先,让我们理解一下“关联映射”。在Hibernate中,关联映射允许我们将Java对象与数据库表的记录进行关联。例如,一个...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在IT领域,"inverse"和"cascade"是两个常见的概念,尤其在数据库设计、软件工程以及数据处理中。这两个术语通常与关系型数据库中的外键约束、对象关系映射(ORM)工具,以及某些编程框架的特性相关。下面将详细阐述这...
Hibernate中cascade与inverse属性详解
在Hibernate中,`cascade`和`inverse`是两个重要的概念,它们涉及到对象之间的关系管理和数据持久化。 **1. Hibernate Cascade** `cascade`属性主要用于控制对象间的级联操作。当在主对象上执行保存、更新、删除等...
### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...
"NHibernate Inverse & Cascade"是两个关键概念,对于理解和有效使用NHibernate至关重要。 **Inverse属性** Inverse属性主要用于控制NHibernate如何处理关联对象的持久化。在一对多或多对一的关系中,当一个实体...
描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...
3. **cascade和inverse的区别**:`cascade`关注的是对象之间的操作传递,而`inverse`关注的是关系的维护。`cascade`决定了一个对象的变更是否会影响到其他关联对象,`inverse`则决定了关系的维护责任在哪个对象。 4...
Hibernate中Inverse和Cascade的区别.html
`inverse`和`cascade`属性是Hibernate集合映射中非常重要的概念,它们帮助开发者更灵活地控制实体之间的关系以及操作的级联行为。合理地使用这两个属性,不仅可以简化代码,还能提高程序的性能和健壮性。然而,不当...
首先,`inverse`属性主要应用于一对多(OneToMany)和多对一(ManyToOne)的关系映射中。默认情况下,Hibernate假设一方(通常是一对多的那一方)负责维护关联关系,也就是说,当这一方的对象被保存或更新时,它会...
同时,确保理解`inverse`和`cascade`的组合使用,以防止意外的数据修改。 综上所述,理解并正确使用Hibernate中的`inverse`属性对于优化JavaEE应用的数据库操作和提高代码质量具有重要意义。通过深入掌握这一特性,...
6. 工具应用:在实际开发中,理解并正确使用`inverse=true`能够提高代码的可维护性和性能。开发者应根据业务需求,谨慎选择关联的维护方,并合理配置级联操作,以达到最佳的数据操作效果。 总结,`inverse=true`是...
<set name="orders" cascade="all-delete-orphan" inverse="true"> ``` 这样,在运行时会执行: ```sql DELETE FROM ORDERS WHERE CUSTOMER_ID = 2 AND ID = 2; ``` #### 四、总结 在使用Hibernate时...