`
jdluojing
  • 浏览: 17963 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

hibernate级联删除问题

 
阅读更多

有用户和用户组两个表,需要使用hibernate做级联删除。映射文件如下:

Groups.hbm.xml

<class name="com.cms.entity.Groups" table="groups" catalog="cms">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="100" not-null="true" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="description" length="500" />
        </property>
        <property name="authority" type="java.lang.String">
            <column name="authority" length="200" />
        </property>

        <set name="users" inverse="true" lazy="false" cascade="all-delete-orphan">
            <key>
                <column name="group_id" not-null="true" />
            </key>
            <one-to-many class="com.cms.entity.User" />
        </set>
</class>
User.hbm.xml

<hibernate-mapping>
    <class name="com.cms.entity.User" table="user" catalog="cms">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native"></generator>
        </id>
        <many-to-one name="groups" class="com.cms.entity.Groups" fetch="select">
            <column name="group_id" not-null="true" />
        </many-to-one>
        <property name="name" type="java.lang.String">
            <column name="name" length="50" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="200" not-null="true" />
        </property>
        <property name="qq" type="java.lang.String">
            <column name="qq" length="50" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="phone" length="50" />
        </property>
        <property name="postDate" type="java.util.Date">
            <column name="post_date" length="0" not-null="true" />
        </property>
        <set name="articles" inverse="true" cascade="all-delete-orphan">
            <key>
                <column name="user_id" not-null="true" />
            </key>
            <one-to-many class="com.cms.entity.Article" />
        </set>
    </class>
</hibernate-mapping>

原本要做的是,删除用户组时将其下所属的用户全部删除;删除用户时,不对用户组进行更改。

结果过执行报错:deleted object would be re-saved by cascade (removedeleted object from associations)

感觉可能是cascade的配置问题,修改了下发现还是报错。后来我将Groups映射文件中<set>元素的lazy属性设置为true。删除成功!但是这样由于是延迟加载,就没法在页面中通过groups来获取User集合中的对象了(本来是想统计用户组中用户成员的个数)。于是还得修改。

查了文档弄明白了怎么回事。

原来cascade属性在lazy=true的时候不起作用(集合中对象还没初始化)。所以在删除User的时候,就不会触发对关联关系的维护。

而当lazy=false的时候,由于我们设置了cascade,那么删除User的时候会触发关系维护,此时虽然在user中已经将对应的Groups属性设置为null(删除前会先将外键设置为null)。但是由于Groups中的Set中仍然还保持着我们删除的User对象,所以触发关系维护的时候,这个User对象又会被重新保存到数据库中。造成了前面出现的异常。

当然,如果我们删除Groups的时候,如果没有将Set的cascade设置为all或delete,那么就会报错: Cannot delete or update a parent row:a foreign key constraint fails,因为groups删除了,User中对groups的外键引用怎么办?

解决的办法就是,如果不需要在groups中直接获取Set中的User对象,那么就把lazy设置为true就可以了。不设置cascade也可以,不过删除groups的时候就可能有问题了。或者通过代码,在删除之前将关联关系解除。

public void delete(User entity) {

entity.getGroups().getUsers().remove(entity);

entity.setGroups(null);

userDao.delete(entity);

}




分享到:
评论

相关推荐

    hibernate 级联查询

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

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

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

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

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

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

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

    Hibernate级联操作一对多demo

    通过这个" Hibernate级联操作一对多demo ",开发者可以深入理解如何在实际项目中利用Hibernate的级联功能来简化代码,提高开发效率,同时也要注意潜在的风险和性能问题。在实践中不断优化,才能更好地掌握这一强大的...

    hibernate级联增删改查

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

    hibernate 级联(cascade和inverse)一对多

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

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

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

    Hibernate级联操作.docx

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

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

    5. **反转关系**:反转关系涉及到主从关系的反转,通常用于解决级联操作带来的问题。例如,如果在`User`和`Order`的关系中,我们希望由`User`来控制级联操作,可以将`@OneToMany`的`mappedBy`属性设在`User`上,然后...

    Hibernate cascade (级联).doc

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

    hibernate3.2的级联关系_JavaProject

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

    hibernate3.2级联关系自身一对多双向关联

    首先,级联关系是指当对主对象进行某些操作(如保存、更新、删除等)时,这些操作也会自动应用到与之相关联的从属对象上。这减少了代码量,并保持了数据的一致性。在Hibernate中,可以通过在`@ManyToOne`或`@...

    Hibernate_范型_级联

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

    struts2 hibernate 实现无限级联 树形分类

    在这个"struts2 hibernate 实现无限级联 树形分类"项目中,主要目标是创建一个能够展示无限级联的树形分类结构。这种结构通常用于组织层次化的数据,如产品类别、部门结构或者权限角色等。无限级联意味着这个树可以...

    解析Oracle中多表级联删除的方法

    在Oracle数据库中,多表级联删除是一种常见的需求,特别是在数据关系复杂的环境中。级联删除允许在删除一个表中的记录时,自动删除依赖于该记录的其他表中的相关记录。以下将详细介绍三种在Oracle中实现多表级联删除...

    详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) 级联在编写触发器时经常用到,触发器的作用是当 主控表信息改变时,用来保证其关联表中数据同步更新。若对触发器来修改或删除关联表相记录,必须...

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

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

    struts2 hibernate 框架 三级城市级联

    通过配置Hibernate的映射文件(hbm.xml),可以将数据库表与Java类关联起来,然后使用Session接口进行CRUD操作(创建、读取、更新、删除)。 实现三级城市级联的具体步骤可能包括以下部分: 1. **设计数据库模型**...

    hibernate的应用表之间的级联关系

    2. **数据完整性**:级联删除可能导致意外的数据丢失,因此在使用`CascadeType.DELETE`时需格外小心。 3. **事务管理**:级联操作通常在同一个事务中进行,确保数据一致性。如果不在同一个事务中,可能会引发并发...

Global site tag (gtag.js) - Google Analytics