这里要说的是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关联关系的级联操作的更多相关文章

  1. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  2. ssh三大框架的认识

    一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架.  集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...

  3. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  4. eclipse中SSH三大框架环境搭建<一>

    这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...

  5. SSH三大框架合辑的搭建步骤

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  6. SSH三大框架整合案例

    SSH三大框架的整合   SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...

  7. SSH三大框架的整合

    SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...

  8. Maven SSH三大框架整合的加载流程

    <Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...

  9. 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询

    这里举样例用的是:部门与员工的关系. 一个部门能够相应多个员工,这就是非常明显的多对一关联关系. 我们须要建立两个实体类:员工(Employee).部门(Department) 员工类:Employe ...

随机推荐

  1. hiho一下第134周 1468 : 2-SAT·hihoCoder新春晚会

    1468 : 2-SAT·hihoCoder新春晚会 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 hihoCoder新春晚会正在紧张地筹备中.晚会分为上半场和下半场, ...

  2. 【树状数组】bzoj2743 [HEOI2012]采花

    http://www.cnblogs.com/proverbs/archive/2012/10/29/2745281.html (↑)这样处理之后,每次询问时,对于每种颜色,从1到其倒数第二次出现的位 ...

  3. Exercise03_01

    import javax.swing.JOptionPane; public class TheDirection { public static void main(String[] args){ ...

  4. WebService综述

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  5. 用Qemu模拟vexpress-a9 (五) --- u-boot引导kernel,device tree的使用

    环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...

  6. hdu 1863 畅通project

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  7. crontab定时任务详解

    1.安装crontab:yum install crontabs 说明:/sbin/service crond start //启动服务/sbin/service crond stop //关闭服务/ ...

  8. javascript快速入门11--正则表达式

    正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 替换文本.可以在文档中使用一个正则表达式来标 ...

  9. 报错:numRecords must not be negative

    报错的原因:删除已经使用过的kafka topic,然后新建同名topic 解决方法:把topic名字换一下 (有其他更好的解决方法,可以不修改topic名)

  10. Netty4 ServerBootstrap 初始化channelFactory ReflectiveChannelFactory

    只需要在启动之前传入你需要用的channel类型就可以了. ServerBootstrap初始化channelFactory过程: 最后我们再来看看这个channelFactory的使用场景: