这里要说的是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. 学习python网站

    http://code.ziqiangxuetang.com/python/python-dictionary.html

  2. NOI2013部分题解

    Day 1 T1:向量内积 直接暴力有60.发现将n个向量合成$n\times d$的矩阵$A$,然后求$A\times A^T$,得到的矩阵包含了所有的答案. 先考虑$k=2$,将答案矩阵和全1矩阵 ...

  3. 【单调队列优化DP】BZOJ1855-[Scoi2010]股票交易

    [题目大意] 已知第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每个i,都有APi>=BPi),第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BSi股. ...

  4. python3 开发面试题(常用模块以及第三方库)6.5

    """ 1. os和sys都是干什么的? 2. 你工作中都用过哪些内置模块? 3. 有没有用过functools模块? """ #sys模块 ...

  5. Problem B: 零起点学算法17——2个数比较大小

    #include<stdio.h> int main() { int n,m; while(scanf("%d %d",&n,&m)!=EOF) if( ...

  6. SQL Server 跨数据库事务

      模拟三个库(同一个实例中),分别是DB1.DB2.DB3 整个事务的业务如下: 1.DB1写入表数据 2.DB2写入表数据 3.DB3调用存储过程写入表数据 4.每次写入表数据间隔模拟抛异常流程, ...

  7. Android2017最新面试题(3-5年经验个人面试经历)

    2017最新Android面试题 大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话. 接触Android已经3年,在工作中遇到疑难问题总是在网上(csdn大牛博客,stacko ...

  8. 13、mha高可用架构搭建

    各节点架构: 192.168.1.20(mysql5.5) master主库 192.168.1.21(mysql5.5) slave1,目标:主库宕可提升为主库 192.168.1.22(mysql ...

  9. npm使用常见问题及注意事项

    1.npm.cnpm.yarn不要混用,一个项目只使用一个 2.NPM problem: npm ERR! extraneous 表明安装了很多不需要的三方包 使用命令 npm prune删除无用的包 ...

  10. vue2计算属性computed

    详见vue2.0 API<计算属性> 需求: 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id=&qu ...