java之hibernate之 cascade和inverse
1.Cascade是级联动作,在many_to_one中如果使用cascade可以级联操作关联对象,如下代码可以级联保存Category对象。
在Book的映射文件设置
<many-to-one name="category" column="cid" cascade="save-update"/>
在保存book时,如果book所对应的category没有保存,那么先保存category再保存book,完成级联保存数据的动作。
Cascade默认值是none,不进行级联动作;
Cascade可以为delete, 在many_to_one中cascade不会设置为delete,因为可能会造成异常,除非是基于外键的一对一。
Cascade还可以为all, all表示可以进行所有的级联动作。
在one_to_many中使用cascade:
<!-- 双向一对多的设置 -->
<set name="books" cascade="save-update">
<!-- 设置外键 -->
<key column="cid"></key>
<!-- 设置多的一端的类型 -->
<one-to-many class="Book"/>
</set>
在保存一端数据时,如果发现关系对象多端数据没有保存,那么会级联保存book; 但是在一端使用级联保存,会多出n条更新语句,所以效率比较低。(即如果多的一端未保存,在一的一端使用级联保存时,会多出n条更新语句,效率较低;所以这种情况下,推荐在多端使用级联,而不推荐在一端使用)
如果在一端cascade="delete",那么在删除一端数据时,会级联将多端的所有数据删除。(慎用)
注意:cascade要起作用,那么一定要设置关联对象。如果关联对象不存在,那么cascade不会有作用。建议少用cascade,甚至不用。
2. inverse:反转, 在hibernate中用于在一的一端来控制关系(外键)由谁来管理(crud)。
<!-- 双向一对多的设置 -->
<set name="books" cascade="save-update" inverse="true">
<!-- 设置外键 -->
<key column="cid"></key>
<!-- 设置多的一端的类型 -->
<one-to-many class="Book"/>
</set>
表示关系(外键)由Book一端来维护(即多的一端)。也就是说要为book对象设置好book对象对应的Category属性,外键才会被维护(保存)。
@Test
public void testInit(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Category c1 = new Category("计算机类");
Category c2 = new Category("文学");
Category c3 = new Category("历史");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Book b1 = new Book("java","sun",30,df.parse("1995-05-23"));
b1.setCategory(c1);
Book b2 = new Book("struts","apache",40,df.parse("2006-09-12"));
b2.setCategory(c1);
Book b3 = new Book("明朝那些事儿","当年明月",70,df.parse("2008-05-23"));
b3.setCategory(c3);
Book b4 = new Book("水浒传","老撕",20,df.parse("1985-05-23"));
b4.setCategory(c2);
c1.getBooks().add(b1);
c1.getBooks().add(b2);
c2.getBooks().add(b4);
c3.getBooks().add(b3);
session.save(c1);
session.save(c2);
session.save(c3);
tx.commit(); } catch (Exception e) {
if(tx!=null)
tx.rollback();
}finally {
HibernateUtil.close();
}
}
如果 inverse=false ,说明一的一端也可以维护关系,也就是说可以通过在一的一端添加多的一端数据,来保存外键关系。
@Test
public void testInit(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Category c1 = new Category("计算机类");
Category c2 = new Category("文学");
Category c3 = new Category("历史");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Book b1 = new Book("java","sun",30,df.parse("1995-05-23"));
Book b2 = new Book("struts","apache",40,df.parse("2006-09-12"));
Book b3 = new Book("明朝那些事儿","当年明月",70,df.parse("2008-05-23"));
Book b4 = new Book("水浒传","老撕",20,df.parse("1985-05-23"));
c1.getBooks().add(b1);
c1.getBooks().add(b2);
c2.getBooks().add(b4);
c3.getBooks().add(b3);
session.save(c1);
session.save(c2);
session.save(c3);
tx.commit(); } catch (Exception e) {
if(tx!=null)
tx.rollback();
}finally {
HibernateUtil.close();
}
}
但是要通过更新语句来完成。所以一般情况下,inverse=true.
在多的一端没有inverse, 因为多的一端默认可以维护关系。
注意:级联和 inverse 都是通过关联对象来完成的,如果没有设置关联对象,这两者均不起作用。在两者都设置的情况,要注意区分谁管理级联,谁管理关系。有可能一个关联对象既管理关系又管理级联。
java之hibernate之 cascade和inverse的更多相关文章
- 具体解释Hibernate中cascade与inverse
学习hibernate的时候对级联关系的概念老是分不清楚,尤其是cascade.inverse傻傻分不清.以下通过样例来简单说明. 准备工作: 首先创建数据库,新建两张表: 教室表classes (字 ...
- hibernate中cascade和inverse
原文:http://blog.sina.com.cn/s/blog_7b9edd020100racc.html 这两个属性都用于一多对或者多对多的关系中. 而inverse特别是用于双向关系,在单向关 ...
- 转 Hibernate中cascade和inverse的作用
Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反 ...
- Hibernate中cascade和inverse的作用
Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反 ...
- hibernate中的cascade和inverse
以Student和class为例,一个Student对应一个class,一个class对应多个Student. Student.hbm.xml <?xml version="1.0&q ...
- hibernate(六) cascade(级联)和inverse关系详解
序言 写这篇文章之前,自己也查了很多的资料来搞清楚这两者的关系和各自所做的事情,但是百度一搜,大多数博文感觉说的云里雾里,可能博主自己清楚是怎么一回事,但是给一个不懂的人或者一知半解的人看的话,别人也 ...
- java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE h ...
- Hibernate中cascade作用
Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...
- 数据库、Java与Hibernate数据类型对照
数据类型对照表: 标准SQL数据类型 Java数据类型 Hibernate数据类型 TINYINT byte.java.lang.Byte byte SMALLINT short.java.lang. ...
随机推荐
- python 操作es
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索 ...
- JVM探究之 —— 类文件结构(脑图)
- buddo源码分析-transport组件之Netty(一)
dubbo 2.5.10 版本,netty仍然使用的是netty的3.10.5版本,我们从下面的代码可以看出,SPI默认使用的是“netty”,而不是“netty4”. package com.ali ...
- Groovy sort() list
https://www.w3cschool.cn/groovy/groovy_sort.html #Groovy sort()方法返回原始列表的排序副本. #句法List sort() #参数没有 # ...
- VUE-012-图表 v-charts 学习(一)饼图展示状态
软件质量平台中需要输出各种各样的图表数据,以 v-charts 中的饼图为例,记录图表使用实现过程. v-charts :https://github.com/ElemeFE/v-charts doc ...
- Python3基础 import...as 给导入的模块起别名
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- 011-MySQL Query Cache 查询缓存设置操作
一.概述 MySQL Query Cache 会缓存select 查询,安装时默认是开启的,但是如果对表进行INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE, ...
- Anaconda(三)
五.TensorFlow安装 这一天由于版本问题走了太多弯路.之前用的conda版本是最新的,自带Python3.7.5,装了之后倒是各种包都能装,用命令: pip install xxx conda ...
- Qt组件(例如按钮、树形控件)上响应鼠标右键
ui->textEdit->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->textEdit,SIGNAL(cust ...
- linux安装redis时报collect2: fatal error: cannot find 'ld'和In file included from adlist.c:34:0:
如题,看了下该ld命令所在文件: [root@centos redis-]# whereis ld ld: /usr/bin/ld.gold /usr/bin/ld /usr/bin/ld.bfd / ...