Hibernate的级联

原创 2018年04月15日 15:29:40

什么是级联? 简单的说,没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。

级联有4种类型:

all:所有操作都执行级联操作;

none:所有操作都不执行级联操作;

delete:删除时执行级联操作; 

save-update:保存和更新时执行级联操作;

级联通常用在one-many和many-to-many上,几乎不用在many-one上。

delete 级联:

修改Category.hbm.xml 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.how2java.pojo">
    <class name="Category" table="category_">
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <property name="name" />

        <set name="products" cascade="delete" lazy="false"><!-- 设置一对多的级联类型是delete-->
            <key column="cid" not-null="false" />
            <one-to-many class="Product" />
        </set>
                 
    </class>
     
</hibernate-mapping>

测试级联关系:

package com.how2java.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Category;

public class TestHibernate {
	public static void main(String[] args) {
		SessionFactory sf = new Configuration().configure().buildSessionFactory();
		Session s = sf.openSession();
		s.beginTransaction();
		Category c = (Category) s.get(Category.class, 3);
		s.delete(c);//运行代码就会发现,删除分类的时候,会把分类下对应的产品都删除掉,否则只会把产品对应的cid设置为空
		s.getTransaction().commit();
		s.close();
		sf.close();
	}
}

save-update 级联:

Category.hbm.xml 的一对多关系中级联设置为:

<set name="products" cascade="save-update" lazy="false">

测试代码如下:

package com.how2java.test;
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
import com.how2java.pojo.Category;
import com.how2java.pojo.Product;
 
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();
        Category c = (Category) s.get(Category.class, 5);
         
        Product p1 = new Product();
        p1.setName("product_501");
        Product p2 = new Product();
        p2.setName("product_502");
        Product p3 = new Product();
        p3.setName("product_503");
 
        c.getProducts().add(p1);
        c.getProducts().add(p2);
        c.getProducts().add(p3);
        //运行代码就会发现,这3个瞬时状态的产品对象虽然没有添加到数据库里,但是在事务提交的时候,会把他们3个持久化。 如果没有cascade="save-update",就会报错
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}
all 就是 delete+save-update
none 就是没有,默认就是none


hibernate级联更新

parent.setName(""); Iterator childs = parent.getChilds().iterator; while(childs.hasNext()){ Ch...
  • a137268431
  • a137268431
  • 2015-04-27 17:36:47
  • 1748

hibernate级联的3个属性

http://www.lwbst.com/viewAction.do?lunwenid=866cascade(级联)级联在编程中经常接触,写过触发器来修改或删除关联表相记录的一定会知道,触发器的作用是...
  • hack103
  • hack103
  • 2008-01-27 21:53:00
  • 1554

hibernate One2Many级联增删改查

环境:maven普通项目 项目结构 1 pom.xml 4.0.0 com.mycompany learHibernate 0.0.1-SNAPSH...
  • tarenahuangdw
  • tarenahuangdw
  • 2015-12-31 15:54:39
  • 1631

hibernate的级联保存操作(一对多)

现在我们开始做级联保存操作的练习,上一篇《hibernate基本保存操作》中介绍了hibernate执行保存过程的操作。我们在那个的基础上来做一对多的级联保存操作; 第一步:创建数据库模型C...
  • u011282647
  • u011282647
  • 2016-12-02 10:30:11
  • 8280

Hibernate级联保存和更新

级联保存和更新当Hibernate持久化一个临时对象时,在默认情下,他不会自动持久化所关联的其他临时对象,如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话:可以把 的cascade属性设置...
  • liumm1983
  • liumm1983
  • 2007-03-26 15:23:00
  • 6408

Hibernate级联保存与删除

Hibernate为程序员提供一种级联操作,在编写程序时,通过Hibernate的级联功能可以很方便的操作数据库的主从表的数据,我们最常用的级联是级联保存和级联删除,下面分别来看一下级联保存和级联删除...
  • lishengbo
  • lishengbo
  • 2016-03-19 17:56:50
  • 5591

Hibernate中的cascade级联属性一对多多对一的增删改过程探讨

在实际业务中,Hibernate应用很广泛,其中的cascade属性也具有很强的可操作性,这里对于其一对多多对一的增删改进行探讨,来整理验证其适用性...
  • tctctttccc
  • tctctttccc
  • 2017-07-28 20:29:36
  • 302

Hibernate一对多级联操作

使用hibernate对mysql进行一对多的级联增删查改操作: 一方为产品的分类(Category.java),多方为具体的产品(Product.java) JavaBean(一方): pac...
  • u012835908
  • u012835908
  • 2017-02-12 12:37:12
  • 2227

Hibernate级联操作 注解

Hibernate级联操作 注解。如果设在many一端的标签里,就是在删除many一端的数据时,会试图删除one一端的数据,如果仍然有many外键引用one,就会报“存在子记录”的错误;如果在one的...
  • a442180673
  • a442180673
  • 2013-10-14 11:04:52
  • 9858
收藏助手
不良信息举报
您举报文章:Hibernate的级联
举报原因:
原因补充:

(最多只允许输入30个字)