`
Messi光明
  • 浏览: 55674 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

删除级联hibernate级联删除

阅读更多
最近研究删除级联,稍微总结一下,前当继续补充:

    oad前当如果子象对生发了更新,也会级联更新). 但它不会级联删除

    delete: 级联删除, 但不备具级联存保和更新

    all-delete-orphan: 在除解父子系关时,主动删除不属于父象对的子象对, 也支撑级联删除和级联存保更新.

    all: 级联删除, 级联更新,但除解父子系关时不会主动删除子象对.

   

    delete-orphan:删除全部和前当象对除解联关系关的象对



    意注:以上设在哪一段就是指对哪一端的操纵而言,比如delete,如果设在one的一端的<set>属性里,就是当one被删除的时候,主动删除全部的子录记;

    如果设在many一端的<many-to-one>标签里,就是在删除many一端的数据时,会试图删除one一端的数据,如果仍然有many外键引用one,就会报“存在子录记”的错误;如果在one的一端同时也设置了cascade=“delete”属性,就会生发很危险的况情:删除many一端的一条录记,会试图级联删除对应的one端录记,因为one也设置了级联删除many,所以其他全部与one联关的many都市被删掉。

    所以,千万谨严在many一端设置cascade=“delete”属性。

    故此cascade一般用在<one-to-one>和<one-to-many>中





    one-to-many中设置级联删除,比如:

   



[xhtml]  view plain copy
<set 
        name="entryvalues" 
        lazy="false" 
        inverse="true" 
        order-by="VALUEID" 
        cascade="all-delete-orphan" 
    > 
        <key> 
            <column name="CONTEXTENTRYID" /> 
        </key> 
        <one-to-many  
            class="Entryvalue" 
        /> 
    </set> 

    如果用Hiberante的SchemaExport导出表到数据库,是不会在数据库中设置外键的cascade属性的,查看ENTRYVALUE表,其中的外键CONTEXTENTRYID的on delete属性是no action

    但是应用Hiberante理管事务,它是会维护这类级联系关的,比如这样操纵:

   



[java]  view plain copy
public void testCascadeDelete() { 
        Session s = HibernateUtil.getSession(); 
        Transaction tx; 
        try { 
            tx = s.beginTransaction(); 
            Contextentry ce = (Contextentry)s.load(Contextentry.class, new Long(1)); 
             
            s.delete(ce); 
            tx.commit(); 
             
        } catch (HibernateException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 

    则引用此Contextentry的Entryvalue是会被确正级联删除的.



    如果应用通普JDBC操纵,比如:

    每日一道理
风,渐渐吹起,吹乱了我的发丝,也让我的长裙有些飘动。绿叶仿佛在风中起舞,离开了树,投向了大地,却不知这样会枯萎,我弯下腰,轻轻拾起一片树叶,那非常有序的茎脉,是一种美的点缀。我有些哀叹:绿叶啊,绿叶,你这般美丽地从树上轻轻飘下,随风起舞,却不知已被人称之为落叶!


   



[java]  view plain copy
public void testCascadeDeleteSQL() { 
        Session s = HibernateUtil.getSession(); 
        Transaction tx; 
        String sql = "delete contextentry where id=4"; 
        try { 
            tx = s.beginTransaction(); 
            Connection con = s.connection(); 
            Statement st = con.createStatement(); 
            st.execute(sql); 
            tx.commit(); 
        } catch (HibernateException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (SQLException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 

    则会报"存在子录记"的错误,这里的Transaction实际上是无效的,因为用的是JDBC的Connection和Statement,已脱离了Hibernate的理管.如果手动将ENTRYVALUE表的关相外键ON DELETE属性设为CASCADE,则面上的操纵当然确正执行——级联删除子录记





    all-delete-orphan 的力能:
1. 当存保或更新父方象对时,级联存保或更新全部联关的子方象对,相当于 cascade 为 save-update
2. 当删除父方象对时,级联删除全部联关的子方象对,相当于 cascade 为 delete
3. 删除不再和父方象对联关的全部子方象对,当然,“不再和父方象对联关的全部子方象对”必须是在本次事务中生发的。

除解父子系关的 java  语句例如:


   



[java]  view plain copy
public void testCascadeDelete() { 
        Session s = HibernateUtil.getSession(); 
        Transaction tx; 
        try { 
            tx = s.beginTransaction(); 
            Contextentry ce = (Contextentry)s.load(Contextentry.class, new Long(5)); 
             
            Entryvalue ev = (Entryvalue)s.load(Entryvalue.class, new Long(10)); 
            ev.setContextentry(null); 
             
            s.delete(ce); 
            tx.commit(); 
             
        } catch (HibernateException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
    } 

    如果 cascade 属性取默认值 null,当除解父子系关时,会执行如下 sql:

    update ENTRYVALUE set CONTEXTENTRYID=null where ID=10

    即将对应外键置为null,而应用all-delete-orphan,则会在关相事务执行的时候,将孤儿子录记删除

文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。
2
0
分享到:
评论
1 楼 新的开始_加油 2014-05-12  

相关推荐

    Hibernate的级联操作(增,删,该)

    2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。...

    hibernate many-to-many级联保存,级联更新,级联删除

    本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...

    hibernate 级联查询

    4. **级联查询示例**:例如,一个用户可以有多个订单,当删除用户时,如果设置了级联删除,那么相关的订单也会被一起删除。 5. **级联操作的优缺点**:优点是简化了代码,提高了开发效率;缺点是如果不合理使用,...

    Hibernate 一对多、多对一、级联、加载、反转

    在Java持久化框架Hibernate中,一对多(One-to-Many)、多对一(Many-to-One)、级联(Cascading)、加载(Loading)和反转(Inversing)是关系映射的重要概念,它们对于理解如何在数据库和对象之间有效地管理关联至...

    spring jpa操作数据库 级联数据 hibernate

    本主题主要围绕"spring jpa操作数据库 级联数据 hibernate"展开,探讨如何利用Spring JPA进行数据库交互,并涉及到级联操作和与Hibernate的集成。 Spring JPA是Spring对Java Persistence API的一个封装,它提供了...

    Hibernate的缓存级联查询

    在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库。尽管随着Spring Data JPA等现代技术的崛起,Hibernate的使用频率有所下降,但其核心...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    hibernate级联增删改查

    本主题将深入探讨"hibernate级联增删改查",特别是针对"t_card主表"和"t_person从表"的关系。 首先,级联操作在Hibernate中是一种配置,用于指定当主表中的实体发生变化时,是否以及如何更新或删除关联的从表实体。...

    Hibernate级联操作一对多demo

    在这个" Hibernate级联操作一对多demo "中,我们将探讨如何在一对多的关系中应用级联操作。 一对多关系是数据库中常见的关系类型,它表示一个实体(如部门)可以有多个相关实体(如员工)。在Hibernate中,这种关系...

    关于Hibernate级联删除的问题.doc

    在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个关键概念。在给出的例子中,有四个表:A、AA、B和BB,它们之间存在一对多(one-to-many)和一对一...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    第七章_Hibernate_-_级联策略

    第七章_Hibernate_-_级联策略 第七章

    用hibernate做的省市县三级级联,

    总的来说,这个项目展示了如何使用Hibernate、Ajax和DWR来实现一个高效、用户友好的省市县三级级联选择功能。开发过程中涉及了ORM、MVC架构、数据库操作以及前端交互等多个方面,是学习和实践Web开发技能的好实例。

    hibernate3.2的级联关系_JavaProject

    级联关系在Hibernate中是指当一个实体发生某种操作(如保存、更新、删除)时,是否会影响到与之相关联的其他实体。通过配置级联关系,我们可以控制这些关联实体的行为。 1. **一对多(OneToMany)**:在数据库中,...

    Hibernate级联操作.docx

    在 Hibernate 中,级联操作(Cascade)和反向属性(Inverse)是管理对象关系的重要概念,特别是在处理一对多(One-to-Many)或多对一(Many-to-One)关系时。 **级联操作(Cascade)** 级联操作定义了当主对象被...

    hibernate 级联(cascade和inverse)一对多

    一、Hibernate级联(Cascade) 级联操作允许我们将对一个实体的更改自动应用到与之关联的其他实体。在一对多关系中,如果一个实体(父实体)与多个实体(子实体)关联,设置级联属性可以确保在处理父实体时,子实体...

    Hibernate_范型_级联

    而级联(Cascading)则是Hibernate中处理关联对象的一种策略,它定义了当一个实体被保存、更新或删除时,与之关联的其他实体应该如何处理。 【描述】: Hibernate中的范型主要体现在SessionFactory、Session、...

    Spring+Hibernate 一对一映射级联增删改查小例子

    本示例将探讨如何在Spring与Hibernate整合的环境中实现一对一(OneToOne)映射,并进行级联操作,包括增、删、改、查。下面我们将详细讲解这一主题。 首先,一对一映射是数据库设计中的一种关系,表示两个表中的一...

    hibernate基础 二 关联映射 级联操作

    ### Hibernate基础之关联映射与级联操作 #### 第一部分:主键生成策略与对象状态管理 ##### 主键生成策略 在使用Hibernate框架时,合理的主键生成策略能够极大地简化开发工作并提升应用性能。Hibernate提供了多种...

    Ajax+struts+hibernate实现级联菜单

    Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单

Global site tag (gtag.js) - Google Analytics