`
jdluojing
  • 浏览: 16516 次
  • 性别: 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级联删除的问题.doc

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

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

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

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

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

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

    方法一:创建约束时设定级联删除(但一般由于各种原因或出于各种考虑在创建数据库时没有设定级联删除)SQL语句: 代码如下:CREATE TABLE “U_WEN_BOOK”.”FARTAB” (“FAR_ID” NUMBER(10) NOT NULL,“FAR_NAME” ...

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

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

    Spring+Hibernate一对多关联映射---部门与员工表的级联添加

    Hibernate 一对多关联映射的测试,主要使用部门与员工的级联关系进行添加测试.

    Hibernate3.1_学习源码

    其中数据库用到级联删除。配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

    Hibernate+中文文档

    3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. ...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上)  8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存 ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 通过Hibernate操纵对象(上) 179 本章站在持久化层的角度,Java对象...

    最全Hibernate 参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    hibernate:一对多,多对多,一对一,乐观锁,二级缓存

    测试实现的功能: 一对一新增 一对多新增 多对多新增 多对多删除 乐观锁 一级缓存,二级缓存,读写并发 query 查询一级缓存 Criteria--基于条件查询 dao 实现测试

    struts hibernate增删改查

    基于Struts 2+Hibernate实现员工管理系统。一个单位有多个部门,每个部门有多名员工,每个员工只属于一...基于该要求,实现员工和部门的管理(包括添加、查询、删除和修改等操作),并且要实现部门与员工之间的级联操作。

    Hibernate中文详细学习文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate 中文 html 帮助文档

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    hibernate 教程

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    Hibernate教程

    Hibernate参考文档 目录 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第...

Global site tag (gtag.js) - Google Analytics