`
ashnl007
  • 浏览: 14295 次
  • 性别: Icon_minigender_1
  • 来自: 江西南昌
社区版块
存档分类
最新评论

cascade和inverse

阅读更多

        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就是孤儿的意思,英语不好伤不起。。。

 

 

  • 大小: 5.2 KB
  • 大小: 5.8 KB
  • 大小: 5.5 KB
分享到:
评论

相关推荐

    Hibernate中cascade和inverse应用

    在 Hibernate 框架中,`cascade` 和 `inverse` 是两个重要的概念,它们主要用于管理对象之间的持久化关系,特别是涉及到一对一(one-to-one)、一对多(one-to-many)和多对多(many-to-many)关系时。这两个属性都...

    hibernate 级联(cascade和inverse)一对多

    在Java的持久化框架Hibernate中,级联操作(Cascade)和反转(Inverse)是两个重要的概念,它们主要用于管理对象关系模型中的关联关系。在一对多的关系中,这些特性可以帮助简化数据操作,提高代码的可读性和维护性...

    关于cascade和inverse属性[文].pdf

    在软件网络技术领域,尤其是在使用Hibernate这种对象关系映射(ORM)框架时,理解和正确使用`cascade`和`inverse`属性至关重要。这两个属性主要用于管理对象之间的关联关系,特别是如何在数据库中维护这些关系。 ...

    关联映射cascade,inverse讲解

    本篇将深入讲解“cascade”和“inverse”这两个重要的概念,以及它们在实际应用中的作用。 首先,让我们理解一下“关联映射”。在Hibernate中,关联映射允许我们将Java对象与数据库表的记录进行关联。例如,一个...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    inverse和cascade使用阐述

    在IT领域,"inverse"和"cascade"是两个常见的概念,尤其在数据库设计、软件工程以及数据处理中。这两个术语通常与关系型数据库中的外键约束、对象关系映射(ORM)工具,以及某些编程框架的特性相关。下面将详细阐述这...

    Hibernate中cascade与inverse属性详解

    Hibernate中cascade与inverse属性详解

    Hibenate cascade

    在Hibernate中,`cascade`和`inverse`是两个重要的概念,它们涉及到对象之间的关系管理和数据持久化。 **1. Hibernate Cascade** `cascade`属性主要用于控制对象间的级联操作。当在主对象上执行保存、更新、删除等...

    hibernate inverse和cascade的详细讲解

    ### Hibernate Inverse 和 Cascade 的详细讲解 #### 一、引言 在ORM(Object-Relational Mapping)领域,Hibernate作为一款流行的Java持久层框架,它提供了丰富的API和配置选项来帮助开发者实现对象与数据库表之间...

    NHibernate Inverse & Cascade

    "NHibernate Inverse & Cascade"是两个关键概念,对于理解和有效使用NHibernate至关重要。 **Inverse属性** Inverse属性主要用于控制NHibernate如何处理关联对象的持久化。在一对多或多对一的关系中,当一个实体...

    Hibernate开发租房系统2 源码

    描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...

    Hibernate常见问题

    3. **cascade和inverse的区别**:`cascade`关注的是对象之间的操作传递,而`inverse`关注的是关系的维护。`cascade`决定了一个对象的变更是否会影响到其他关联对象,`inverse`则决定了关系的维护责任在哪个对象。 4...

    Hibernate中Inverse和Cascade的区别.html

    Hibernate中Inverse和Cascade的区别.html

    hibernate集合映射inverse和cascade详解.txt

    `inverse`和`cascade`属性是Hibernate集合映射中非常重要的概念,它们帮助开发者更灵活地控制实体之间的关系以及操作的级联行为。合理地使用这两个属性,不仅可以简化代码,还能提高程序的性能和健壮性。然而,不当...

    inverse 例子

    首先,`inverse`属性主要应用于一对多(OneToMany)和多对一(ManyToOne)的关系映射中。默认情况下,Hibernate假设一方(通常是一对多的那一方)负责维护关联关系,也就是说,当这一方的对象被保存或更新时,它会...

    JavaEE学习笔记之Hibernate表关系之一对多(inverse详解)

    同时,确保理解`inverse`和`cascade`的组合使用,以防止意外的数据修改。 综上所述,理解并正确使用Hibernate中的`inverse`属性对于优化JavaEE应用的数据库操作和提高代码质量具有重要意义。通过深入掌握这一特性,...

    inverse=true的总结

    6. 工具应用:在实际开发中,理解并正确使用`inverse=true`能够提高代码的可维护性和性能。开发者应根据业务需求,谨慎选择关联的维护方,并合理配置级联操作,以达到最佳的数据操作效果。 总结,`inverse=true`是...

    hibernate_配置cascade_及all-delete-orphan.doc

    &lt;set name="orders" cascade="all-delete-orphan" inverse="true"&gt; ``` 这样,在运行时会执行: ```sql DELETE FROM ORDERS WHERE CUSTOMER_ID = 2 AND ID = 2; ``` #### 四、总结 在使用Hibernate时...

Global site tag (gtag.js) - Google Analytics