`
neptune
  • 浏览: 362068 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

cascade与inverse分析笔记

阅读更多

在介绍cascade和inverse之前我们要明确一个问题,这两个xml属性标签,都是定义某个set集合(<set>)或是某个<many-to-one>标签的级联操作和关联维护关系的。因此也只有其做为属性的父类在操作这些属性时,它们才起作用。

cascade

例如:

<class name="Test1" table="Test1" >
<id name="id">
<generator class="increment" />
</id>
<set name="childs" cascade="save-update" inverse="true">
<key column="parentId"></key>
<one-to-many class="Test1" />
</set>

<many-to-one name="parent" column="parentId" class="Test1" />
<property name="name" />
</class>

以下是测试代码

Test1 test3 = new Test1();
test3.setName("test3");
Test1 test1 = (Test1) this.getTemplate().load(Test1.class, 1l);
test1.getChilds().add(test3);
   

这段代码执行完成后会生成一条insert语句

insert into Test1(id,name,parentId) values(?,?,?)

?=1,?=test3,?=null

为什么会产生一条insert语句,这是因为cascade=save-update的作用,如果主对象修改childs的集合(增或删集合内容,或修改了集合中某个对象的属性),则会相应的产生insert和update语句.如果我们设置cascade=none,还是上面的代码,则不会有这条insert语句生成.

如果cascade=save-update,delete或all,则下列代码将删除id=1,及其下的所有的子对象

Test1 test1 = (Test1) this.getTemplate().load(Test1.class, 1l);
this.getTemplate().delete(test1);
 

如果cascade=cascade="save-update,delete,delete-orphan",则下列代码将删除id=2的子对象,因为其已不是test1的子对象了(按照delete-orphan规则)

Test1 test1 = (Test1) this.getTemplate().load(Test1.class, 1l);
test1.getChilds().remove(this.getTemplate().load(Test1.class, 2l));
 

 

inverse

例如:

    <class name="Test1" table="Test1" >
        <id name="id">
            <generator class="increment" />
        </id>
        <set name="childs" cascade="save-update" inverse="false" >
            <key column="parentId"></key>
            <one-to-many class="Test1" />
        </set>

        <many-to-one name="parent" column="parentId" class="Test1" />
        <property name="name" />
    </class>

还是上面的java代码,执行完后会生成两条语句

insert into Test1 (parentId, name, id) values (?, ?, ?)
update Test1 set parentId=? where id=?

?1=null,?2=test3,?3=4

?4=1,?5=4

为什么会产生两句sql语句,因为inverse=false的作用,inverse=false的一段,是由主对象来维护关联关系,所以主对象只会修改其子对象的外键字段。

注意:第一条insert语句是cascade=save-update的作用产生的。

         第二条update语句是inverse=false作用产生的。两者没有任何关系。

如果还是上面的java代码,我们把inverse=true,则只会生成一条insert语句

insert into Test1(id,name,parentId) values(?,?,?)

?=1,?=test3,?=null

为什么parentId还是被设置为null,因为我们的java代码不对,inverse=true则表示将由子类端(childs)来维护外键关系.

如果我们把java代码修改成这样:

 
Test1 test3 = new Test1();
test3.setName("test3");
Test1 test1 = (Test1) this.getTemplate().load(Test1.class, 1l);
test1.getChilds().add(test3);
test3.setParent(test1);
 

会生成insert语句中将明确的会赋值parentId。因为test3.setParent(test1)使test3子对象知道了其父对象是谁.

即然是inverse=true,还有test3.setParent(test1);语句,那我们还要test1.getChilds().add(test3);语句做什么,其应该是没用的语句呀,这里如果你这样想,则忽略的一个问题,上面的代码是被一个hibernate的事务包围,在这段代码只有test1是持久性的,在hibernate事务处理后的清除语句(flush)中将只对持久化被修改的属性生成sql语句,这点很重要.

分享到:
评论

相关推荐

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

    2. **级联操作**:`inverse`属性常与`cascade`属性一起使用。`cascade`定义了关联实体的操作是否应级联到另一端。例如,`cascade="save-update"`意味着当父实体被保存或更新时,其关联的子实体也会随之保存或更新。...

    Hibernate学习笔记和资料

    hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式

    Hibernate映射笔记

    - `&lt;one-to-one&gt;`、`&lt;many-to-one&gt;`、`&lt;one-to-many&gt;`和`&lt;many-to-many&gt;`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`&lt;class&gt;`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...

    hibernate 学习笔记3

    描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在Hibernate框架中,一对多关系是一种...

    hibernate学习笔记

    ### Hibernate中的Inverse属性详解 在Hibernate框架中,`inverse`属性是用于管理对象...通过上述实例分析,我们可以看到`inverse`属性在实际开发中的应用价值,以及它如何帮助我们构建更加健壮和高效的数据库应用。

    我的学习笔记

    #### Inverse与cascade属性 `inverse`属性用于控制关联关系的维护方,即哪一方负责更新关联的外键。`cascade`属性则用于控制一系列级联操作,如在父实体上执行操作时自动在子实体上执行相同的操作。 #### 继承映射 ...

    Hibernate笔记.doc

    通过设置`inverse`和`cascade`属性,可以确保关联的正确性和数据库状态的同步,同时提高程序的性能和逻辑的独立性。在添加、更新或删除关联对象时,Hibernate会根据这些属性自动处理相应的数据库操作。 总之,理解...

    hibernate笔记整理

    &lt;set name="users" cascade="all" inverse="true"&gt; &lt;key column="roomid"&gt;&lt;/key&gt; &lt;one-to-many class="UserInfo"&gt;&lt;/one-to-many&gt; ``` 2. **UserInfo.hbm.xml映射文件**: - 定义了`UserInfo`类与数据库...

    Hibernate笔记

    &lt;set name="students" inverse="true" cascade="all" fetch="subselect"&gt; ``` #### 五、批量处理与性能优化 - **Batch Size**: Hibernate支持批量处理,可以通过设置`batch_size`属性来控制批量加载的数量...

    hibernate配置笔记

    - `&lt;set name="items"cascade="all-delete-orphan" inverse="true"&gt;` 描述了`Order`类中名为`items`的集合属性与数据库表的关系。`cascade="all-delete-orphan"`表示当父对象被删除时,所有孤儿子对象也将被删除。`...

    Hibernate1对N案例笔记

    &lt;set name="employees" table="Employee" inverse="true" cascade="all-delete-orphan"&gt; ``` 这样,当删除部门时,所有关联的员工也会被删除。 此外,我们还需要实现查询功能,包括模糊查询。这通常通过SQL的...

    Hibernate学习笔记_songjignhao_1

    注意设置 cascade 参数以处理级联操作,inverse 参数用来指定维护关系的一方。 其次,一对多双向自身关联关系,例如 Category 类,每个 Category 可能有多个子 Category(childCategories),同时每个 Category 也...

    hibernate 学习笔记4

    ### Hibernate 学习笔记4 —— 多对多关系与多态映射 #### 多对多关系 在 Hibernate 中处理多对多关系时,通常采用一种称为“连接表”或“关联表”的方法来实现两个实体之间的多对多关联。这种设计方式较为常见且...

    hibernate 中HQL语句查询学习笔记

    ### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...

Global site tag (gtag.js) - Google Analytics