在介绍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语句,这点很重要.
分享到:
相关推荐
2. **级联操作**:`inverse`属性常与`cascade`属性一起使用。`cascade`定义了关联实体的操作是否应级联到另一端。例如,`cascade="save-update"`意味着当父实体被保存或更新时,其关联的子实体也会随之保存或更新。...
hibernate中一对一,一对多,多对多关系的配置,延迟加载,cascade,inverse hibernate查询方式概述,HQL查询,QBC查询,分页,结果集封装方式 ,高级查询 查询的优化,一级缓存,二级缓存,批量查询,注解方式
- `<one-to-one>`、`<many-to-one>`、`<one-to-many>`和`<many-to-many>`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`<class>`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...
描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在Hibernate框架中,一对多关系是一种...
### Hibernate中的Inverse属性详解 在Hibernate框架中,`inverse`属性是用于管理对象...通过上述实例分析,我们可以看到`inverse`属性在实际开发中的应用价值,以及它如何帮助我们构建更加健壮和高效的数据库应用。
#### Inverse与cascade属性 `inverse`属性用于控制关联关系的维护方,即哪一方负责更新关联的外键。`cascade`属性则用于控制一系列级联操作,如在父实体上执行操作时自动在子实体上执行相同的操作。 #### 继承映射 ...
通过设置`inverse`和`cascade`属性,可以确保关联的正确性和数据库状态的同步,同时提高程序的性能和逻辑的独立性。在添加、更新或删除关联对象时,Hibernate会根据这些属性自动处理相应的数据库操作。 总之,理解...
<set name="users" cascade="all" inverse="true"> <key column="roomid"></key> <one-to-many class="UserInfo"></one-to-many> ``` 2. **UserInfo.hbm.xml映射文件**: - 定义了`UserInfo`类与数据库...
<set name="students" inverse="true" cascade="all" fetch="subselect"> ``` #### 五、批量处理与性能优化 - **Batch Size**: Hibernate支持批量处理,可以通过设置`batch_size`属性来控制批量加载的数量...
- `<set name="items"cascade="all-delete-orphan" inverse="true">` 描述了`Order`类中名为`items`的集合属性与数据库表的关系。`cascade="all-delete-orphan"`表示当父对象被删除时,所有孤儿子对象也将被删除。`...
<set name="employees" table="Employee" inverse="true" cascade="all-delete-orphan"> ``` 这样,当删除部门时,所有关联的员工也会被删除。 此外,我们还需要实现查询功能,包括模糊查询。这通常通过SQL的...
注意设置 cascade 参数以处理级联操作,inverse 参数用来指定维护关系的一方。 其次,一对多双向自身关联关系,例如 Category 类,每个 Category 可能有多个子 Category(childCategories),同时每个 Category 也...
### Hibernate 学习笔记4 —— 多对多关系与多态映射 #### 多对多关系 在 Hibernate 中处理多对多关系时,通常采用一种称为“连接表”或“关联表”的方法来实现两个实体之间的多对多关联。这种设计方式较为常见且...
### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...