Hibernate的级联操作

一 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(主对象一方)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值