hibernate中关系操作(inverse)和级联操作(cascade)详解

以用户、角色、用户文件为例讲解inverse(关系操作)和(cascade)操作

inverse 取值 true(不维护关系)或false(维护关系  默认为false) 该属性主要操作的是外键

cascade 取值null(默认值)、save-update 、all 、delete

用户、角色是多对多的关系

用户的映射文件表示:

<hibernate-mapping>

<class name="com.xing.elec.domain.ElecUser" table="Elec_User">

。。。。。

<set name="elecUserFiles" table="Elec_User_File" inverse="true" order-by="progressTime desc"  cascade="delete">

<key>

<column name="userID"></column>

</key>

<one-to-many class="com.xing.elec.domain.ElecUserFile"/>

</set>

<set name="elecRoles" table="elec_user_role"
inverse="true">

<key>

<column name="userID"></column>

</key>

<many-to-many class="com.xing.elec.domain.ElecRole" column="roleID"></many-to-many>

</set>

</class>

</hibernate-mapping>

角色的映射文件:

<hibernate-mapping>

<class name="com.xing.elec.domain.ElecRole" table="Elec_Role">

。。。。

<set name="elecUsers" table="elec_user_role">

<key>

<column name="roleID"></column>

</key>

<many-to-many class="com.xing.elec.domain.ElecUser" column="userID"/>

</set>

</class>

</hibernate-mapping>

关系操作:

事例一:

由于用户和用户文件建立关联的set标签中 的inverse 设置为true 因此用户和用户文件之间建立的关系(外键)由用户文件来维护

比如说在 新增用户时一个用户有多个用户文件  在向数据库添加插入数据前要执行  elecUserFile.setElecUser(elecUser);该行代码

改行代码的作用是将用户和用户文件建立关联关系  即(当用户和用户文件的数据插入数据库时 用户文件表中对应的外键有值)

事例二:

由于用户和角色(即:用户表)建立关联的set标签中的inverse设置值为true    而角色用户(即:角色表)建立的关联的set标签设置为inverse="false"(默认为false) 则:

在删除用户时要删除用户和角色的关联关系(用户角色表中的相关数据)

如果用用户来删除用户角色表中相关的数据   该操作会报一个异常(存在外键不能删除的异常)

正确做法: 是通过用户来获取该用户所有的角色(set集合)然后遍历该set集合得到该用户的每个角色  通过角色在获取用户的set集合  然后在删除该用户

(使用角色来删除用户角色表中的数据 其实也就是使用角色来操作外键)

代码实现:

Set<ElecRole> elecRoles=user.getElecRoles();

if(elecRoles!=null && elecRoles.size()>0){

for(ElecRole elecRole:elecRoles){

//(通过角色获取封装用户的set集合   来删除用户)

elecRole.getElecUsers().remove(user);

}

}

级联操作

事例一:

条件:由于用户和用户文件建立关联的set标签中 cascade设置为delete

结果: 当删除用户信息时 与该用户有关的用户文件信息都会被删除(这属于级联删除操作)

总结:

inverse: 用来维护关系  一般我们用多的一方来维护一的一方(这样效率高) 而用一的一方来维护多的一方(这样执行的效率不好)

cascade:主要用于一对一  和一对多   多对多不建议使用

多对多不建议使用cascade 的原因(以用户角色为例):如果删除一个用户 就会删除用户表关联的用户角色表以及角色表中相关的数据 而角色表中的数据不应该删除

时间: 2024-10-27 08:33:10

hibernate中关系操作(inverse)和级联操作(cascade)详解的相关文章

ORM进阶之Hibernate中关系映射

ORM进阶之 ORM简介 ORM进阶之Hibernate简介及框架搭 ORM进阶之Hibernate的三大对象 ORM进阶之Hibernate中对象的三大状态解析 ORM进阶之Hibernate中一对一的关系映射 映射可以说是在hibernate中非常重要的一个内容,通过映射可以让程序员不再思考复杂的sql语句,而是更加的专注于业务逻辑的实现.映射通过一个xml配置文件完成并且我们可以对他进行修改!下边我们来看一下如何完成映射的! 单表映射 每个实体对应一张表,跟其他的实体没有关联关系,这是最简

JS中的定时函数(setTimeout,clearTimeout,setInterval,clearInterval详解 )

设置定时器,在一段时间之后执行指定的代码,setTimeout与setInterval的区别在于setTimeout函数指定的代码仅执行一次 方法一: window.setTimeout("alert('ok')",5000); 方法二: window.setTimeout(function() { alert("Ok"); }, 5000); 方法三: function showAlert() { alert("ok"); } window.s

Node.js中的不安全跳转如何防御详解

Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强劲的Java引擎,于是Google自己开发了一个高性能的开源的Java引擎,名字叫V8.在2009年,Ryan正式推出了基于Java语言和V8引擎的开源Web服务器项目,命名为Node.js. 对于任何web开发人员来说,不安全或未经验证的重定向都是重要的安全考虑因素.Express为重定向提供了本地支持,使它们易于实现和使用.Express是一种保持最

JS中获取 DOM 元素的绝对位置实例详解

在操作页面滚动和动画时经常会获取 DOM 元素的绝对位置,例如 本文 左侧的悬浮导航,当页面滚动到它以前会正常地渲染到文档流中,当页面滚动超过了它的位置,就会始终悬浮在左侧. 本文会详述各种获取 DOM 元素绝对位置 的方法以及对应的兼容性.关于如何获取 DOM 元素高度和滚动高度,请参考视口的宽高与滚动高度 一文. 概述 这些是本文涉及的 API 对应的文档和标准,供查阅: API 用途 文档 标准 offsetTop 相对定位容器的位置 MDN CSSOM View Module clien

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

ORACLE中RECORD、VARRAY、TABLE的使用详解

 1     说明 1.1       RECORD 定义记录数据类型.它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离的.基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型.在使用记录数据类型变量时,需要在声明部分先定义记录的组成.记录的变量,然后在执行部分引用该记录变量本身或其中的成员. 定义记录数据类型的语法如下: TYPE RECORD_NAME IS RECORD( V1  DATA_TYPE1 [NOT NULL][:=DE

转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解 多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群.如果您对这些都没什么概念,可能需要先了解一些基础知识) 关于条件变量典型的实际应用,可以参考非常精简的Linux线程池实现(一)——使用互斥锁和条件变量,但如果对条件变量不熟悉最好先看完本文. Pthread库的条件变量机制的主要API有三个: int p

【转】Java中print、printf、println的区别详解

Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.printf("the number is: d",t);参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E

转载:Js中的window.parent ,window.top,window.self 详解

原文地址  <Js中的window.parent ,window.top,window.self 详解> 在应用有frameset或者iframe的页面时, parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口. window.self 功能:是对当前窗口自身的引用.它和window属性是等价的. 语法:window.self 注:window.self.window.sel

LNMP中一些隐藏的安装脚本及目录详解

伏笔VPS一向在用军哥的LNMP一键script搭建站点,使用的人挺多的,而许多人只晓得script是部署Nginx.MySQL/MariaDB.PHP.phpMyAdmin等建站主要环境的,却不晓得该部署包的别的功能script,这里就说下隐蔽的别的软件script及部署目录. script 1.lnmp部署 #这里用的是最新测试版1.5 wget -c http://soft.vpser.net/lnmp/lnmp1.5beta.tar.gz && tar zxf lnmp1.5bet