Hibernate的级联操作

来源:互联网 发布:欲安所归乎 编辑:程序博客网 时间:2024/05/17 23:44
一 Hibernate的级联操作
所谓级联操作就是说,当你进行某个操作(添加/修改/删除...),就由hibernate自动给你完成。
举例1:学生部门关系
Department <---->Student 对象关系,我希望当我删除一个department ,那么就自动删除该部门的所有学生。
举例2:BBS项目
主帖<---->回帖 , 把主帖删除,那我们就希望把该主帖的回帖自动删除,这样我们可以使用级联(cascade)操作。

二 案例——当删除某个部门的时候,就删除该部门的学生
1 配置文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";><hibernate-mapping package="com.hsp.domain"><class name="Department" lazy="false" ><!-- 配置主键属性 --><id name="id" type="java.lang.Integer"><!-- 生成策略 --><generator class="increment"></generator></id><property name="name" type="java.lang.String"><column name="name" length="64" not-null="true"/></property><!-- 配置one-to-many关系 cascade="delete" 当删除部门的时候(主对象,则级联删除它的学生从对象)--><set name="stus" cascade="delete"><!-- 指定Student类对应的外键 --><key column="dept_id" /><one-to-many class="Student" /></set></class></hibernate-mapping>


2 测试代码
package com.hsp.view;import java.util.HashSet;import java.util.Set;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.Transaction;import com.hsp.domain.Department;import com.hsp.domain.Student;import com.hsp.util.HibernateUtil;public class TestMain {    /**     * @param args     */    public static void main(String[] args) {                // TODO Auto-generated method stub        //通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml)        Session s=null;        Transaction tx=null;                try {            //我们使用基础模板来讲解.            s=HibernateUtil.getCurrentSession();            tx=s.beginTransaction();            //演示级联删除            //获取某个部门            Department department=(Department) s.get(Department.class, 1);            s.delete(department);                       tx.commit();        } catch (Exception e) {            if(tx!=null){                tx.rollback();            }        }finally{                        if(s!=null && s.isOpen()){                s.close();            }        }}



三 案例-演示save-update
1 配置
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";><hibernate-mapping package="com.hsp.domain"><class name="Department" lazy="false" ><!-- 配置主键属性 --><id name="id" type="java.lang.Integer"><!-- 生成策略 --><generator class="increment"></generator></id><property name="name" type="java.lang.String"><column name="name" length="64" not-null="true"/></property><!-- 配置one-to-many关系 cascade="delete" 当删除部门的时候(主对象,则级联删除它的学生从对象)--><set name="stus" cascade="save-update"><!-- 指定Student类对应的外键 --><key column="dept_id" /><one-to-many class="Student" /></set></class></hibernate-mapping>


2 测试代码
package com.hsp.view;import java.util.HashSet;import java.util.Set;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.Transaction;import com.hsp.domain.Department;import com.hsp.domain.Student;import com.hsp.util.HibernateUtil;public class TestMain {    /**     * @param args     */    public static void main(String[] args) {                // TODO Auto-generated method stub        //通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml)        Session s=null;        Transaction tx=null;                try {            //我们使用基础模板来讲解.            s=HibernateUtil.getCurrentSession();            tx=s.beginTransaction();                        Department department=new Department();            department.setName("业务部门1");                       Student stu1=new Student();            stu1.setName("顺平1");                        Student stu2=new Student();            stu2.setName("小明1");                        Set sets=new HashSet<Student>();            sets.add(stu1);            sets.add(stu2);            department.setStus(sets);                        s.save(department);            tx.commit();                    } catch (Exception e) {            if(tx!=null){                tx.rollback();            }        }finally{                        if(s!=null && s.isOpen()){                s.close();            }        }}



3 测试结果
Hibernate: select max(id) from Department
Hibernate: select max(id) from Student
Hibernate: insert into Department (name, id) values (?, ?)
Hibernate: insert into Student (name, dept_id, id) values (?, ?, ?)
Hibernate: insert into Student (name, dept_id, id) values (?, ?, ?)
Hibernate: update Student set dept_id=? where id=?
Hibernate: update Student set dept_id=? where id=?

四 说明
① 在集合属性和普通属性中都能使用cascade
② 一般讲cascade配置在one-to-many(one的一方,比如Employee-Department),和one-to-one(主对象一方)
原创粉丝点击