【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
这里要说的是Hibernate的关联关系的级联操作,使用cascade属性控制。
依旧用部门和员工举例。多个员工相应一个部门(多对一关联关系)
员工类:Employee.java
package cn.itcast.hibernate.domain; public class Employee {
private int id;
private String name;
private Department depart; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDepart() {
return depart;
}
public void setDepart(Department depart) {
this.depart = depart;
}
}
员工类映射文件:Employee.hbm.xml
<? xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.itcast.hibernate.domain">
<class name="Employee" table="tb_Employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<many-to-one name="depart" column="depart_id" />
</class> </hibernate-mapping>
部门类:Department.java
package cn.itcast.hibernate.domain; import java.util.Set; public class Department {
private int id;
private String name;
private Set<Employee> emps; public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
部门映射文件:Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="cn.itcast.hibernate.domain"> <class name="Department" table="tb_Department">
<id name="id">
<generator class="native"/>
</id>
<property name="name" /> <set name="emps" cascade="save-update">
<key column="depart_id" />
<one-to-many class="Employee" />
</set>
</class> </hibernate-mapping>
能够看到,在上边的set标签中。我们定义了cascade="save-update"属性,当session通过save(),update(),saveOrUpdate()方法来保存或更新对象时,级联保存全部关联的新建的暂时对象。而且级联更新全部关联的游离对象
我们来写一个測试类:Many2One.java
package cn.itcast.hibernate; import java.util.HashSet;
import java.util.Set; import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction; import cn.itcast.hibernate.domain.Department;
import cn.itcast.hibernate.domain.Employee; public class Many2One {
public static void main(String[] arg){
Department depart = add(); delete(1);
} static Department add(){
Session s = null;
Transaction tx = null;
try{
Department depart = new Department(); depart.setName("depart name"); Employee emp1 = new Employee();
emp1.setDepart(depart); //建立两个对象的关联关系
emp1.setName("emp name"); Employee emp2 = new Employee();
emp2.setDepart(depart); //建立两个对象的关联关系
emp2.setName("emp name"); Set<Employee> emps = new HashSet<Employee>();
//把两个Employee对象加入到set集合中
emps.add(emp1);
emps.add(emp2);
//为Department对象注入set集合属性
depart.setEmps(emps); s = HibernateUtil.getSession();
tx = s.beginTransaction(); //保存Department对象
s.save(depart); tx.commit();
return depart;
}finally{
if(s!=null){
s.close();
}
}
} static Department delete(int departId){
Session s = null;
Transaction tx = null;
try{
s = HibernateUtil.getSession();
tx = s.beginTransaction();
Department depart = (Department)s.get(Department.class, departId); //依据ID查询
s.delete(depart); tx.commit();
return depart;
}finally{
if(s!=null){
s.close();
}
}
}
}
能够看到我们定义了两个方法:add()和delete()
add():在这种方法中。我们在保存的时候只保存了Department对象。可是依据cascade="save-update"属性。两个Employee对象也会保存在数据库中
delete():在这种方法中,我们想通过直接删除Department对象使得数据库中与Department表关联的Employee表中的数据删除。可是。我们配置的cascade是要求在保存或者更新的时候发生级联关系,所以假设我们运行delete()方法后,仅仅会在Department表的数据被删除。Employee表的数据的外键会变成null。可是数据不会被删除
下边我们来看下cascade的取值:
Cascade属性的取值有:
1、none:忽略其它关联的对象。默认值。
2、save-update:当session通过save(),update(),saveOrUpdate()方法来保存或更新对象时,级联保存全部关联的新建的暂时对象。而且级联更新全部关联的游离对象。
3、persist:当session通过persist()方法来保存当前对象时。会级联保存全部关联的新建的暂时对象。
4、merge:通过Session的merge()方法来保存当前对象时。会级联融合全部关联的游离对象。
5、delete:通过delete()删除当前对象时,会级联删除全部关联的对象。
6、lock:通过lock()把当前游离对象增加session缓存时。会把全部的游离对象也增加Session缓存中。
7、replicate:通过replicate()复制当前对象时,会级联复制全部关联的对象。
8、evict:通过evict()清除session缓存中对象时,会级联清除全部关联的对象。
9、refresh:通过refresh()刷新当前对象时,会级联刷新全部关联的对象。
(刷新是指同步更新session缓存中数据)
10、all:save-update(),persist(),merge(),delete(),lock(),replicate(),evict()及refresh()的行为。
11、delete-orphan,删除全部和当前对象时。解除关联行为的对象。
12、all-delete-orphan; 通过delete()删除当前对象时,会级联删除全部关联的对象。
【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作的更多相关文章
- eclipse中SSH三大框架环境搭建<三>
相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...
- ssh三大框架的认识
一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...
- eclipse中SSH三大框架环境搭建<二>
通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...
- eclipse中SSH三大框架环境搭建<一>
这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...
- SSH三大框架合辑的搭建步骤
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- SSH三大框架整合案例
SSH三大框架的整合 SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...
- SSH三大框架的整合
SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...
- Maven SSH三大框架整合的加载流程
<Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...
随机推荐
- NGUI_Sprites
一.UI Sprites 控件: Sprites控件是NGUI的基础控件,几乎可以这么说所有的控件都可以基于Sprites控件添加 Box Collider然后进行附加相关的脚本组件来达到想要的插件效 ...
- 对mysql数据库表的相关操作
虫师博客(Python使用MySQL数据库(新)): https://www.cnblogs.com/fnng/p/3565912.html 1.更改表的结构,增加一个字段放置新增的属性 alter ...
- [BZOJ 1799] self 同类分布
Link: BZOJ 1799 传送门 Solution: 一句话的题目,看得爽,做得烦 一般这类和数位相关的都是数位$dp$吧 不过一开始还是感觉不太可做,毕竟每个数模数不同 但要发现,模数最高也只 ...
- 前端基础-JavaScript的基本概述和语法
1.JavaScript概述 2.JavaScript引入方式 3.JavaScript语言规范 4.JavaScript语言基础 5.JavaScript数据类型 6.JavaScript运算符 7 ...
- 一个强大的UI node 抽象
基于cocos2d -x的一个强大的 界面对象的基类 ---@type uinode ui 对象的抽象 --@usage -- 界面打开的执行流程 -- 带*的是可选重写的函数,不带*的为必须实现的 ...
- 移动端与PHP服务端接口通信流程设计(基础版)
针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...
- java工具类获取properties文件的配置
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...
- python-sdk-demo的打包
1.安装setuptools pip install python-setuptools 2.创建一个简单的包 下载demo https://github.com/cp-m/py-sdk-demo.g ...
- 小二助手-react.js分块加载
小二助手在线演示地址:http://118.25.217.253:8000 账号test 密码123 小二助手是用material-ui开发的,感觉国内使用的人数不是特别多,所以创建了一个qq交流群 ...
- 理解JS中的模块规范(CommonJS,AMD,CMD)
随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...