这个问题个人认为看你用的那种方式,如果是注解式的

比如:

@ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.PERSIST}, fetch = FetchType.LAZY)

@JoinTable(name = "F_USERTOAUTHORITY", joinColumns = { @JoinColumn(name = "authorityid") }, inverseJoinColumns = { @JoinColumn(name = "userid") })

private List<User> users;

CascadeType不要写成all就可以解决了!

deleted object ould be re-saved by cascade

在Hibernate中,删除存在关联关系的一个对象时,会出现 org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)这个异常

如下:
持久化类:

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

/**
 * 产品类别对象
 * @author crazycy
 *
 */
public class ProductCategory extends BaseObject {

// Fields

private long id;

private String name;

private String description;

private ProductCategory parentCategory;

private Set childrenCategories = new HashSet();

// Constructors

/** default constructor */
    public ProductCategory() {
    }

/** minimal constructor */
    public ProductCategory(String name) {
        this.name = name;
    }
    
    public ProductCategory(String name, String description) {
        this.name = name;
        this.description = description;
    }

/** full constructor */
    public ProductCategory(String name, String description,
            ProductCategory parentCategory) {
        this.name = name;
        this.description = description;
        this.parentCategory = parentCategory;
    }

/** full constructor */
    public ProductCategory(String name, String description,
            Set childrenCategories) {
        this.name = name;
        this.description = description;
        this.childrenCategories = childrenCategories;
    }

// Property accessors

public long getId() {
        return this.id;
    }

public void setId(long id) {
        this.id = id;
    }

public String getName() {
        return this.name;
    }

public void setName(String name) {
        this.name = name;
    }

public String getDescription() {
        return this.description;
    }

public void setDescription(String description) {
        this.description = description;
    }

public ProductCategory getParentCategory() {
        return this.parentCategory;
    }

public void setParentCategory(ProductCategory parentCategory) {
        this.parentCategory = parentCategory;
    }
    
    /**
     * 由主来调:是主添加
     * @param productCategory
     */
    public void addCategory(ProductCategory productCategory) {
        productCategory.setParentCategory(this);
        childrenCategories.add(productCategory);
    }
    
    /**
     * 由主来调;是从主删除
     * @param productCategory
     */
    public void removeCategory(ProductCategory productCategory) {
        childrenCategories.remove(productCategory);
        productCategory.setParentCategory(null);
    }
    
    public Set getChildrenCategories() {
        return childrenCategories;
    }

public void setChildrenCategories(Set childrenCategories) {
        this.childrenCategories = childrenCategories;
    }

/**
     * @see java.lang.Object#equals(Object)
     */
    public boolean equals(Object object) {
        if (!(object instanceof ProductCategory)) {
            return false;
        }
        ProductCategory rhs = (ProductCategory) object;
        return new EqualsBuilder().append(this.description, rhs.description)
                .append(this.name, rhs.name).append(this.id, rhs.id).isEquals();
    }

/**
     * @see java.lang.Object#hashCode()
     */
    public int hashCode() {
        return new HashCodeBuilder(1009592109, -669108101).append(
                this.description).append(this.name).append(this.id)
                .toHashCode();
    }

/**
     * @see java.lang.Object#toString()
     */
    public String toString() {
        return new ToStringBuilder(this).append("name", this.name).append(
                "description", this.description).append("id", this.id)
                .toString();
    }

}

映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="">
    <class name="ProductCategory" table="productcategory">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="string">
            <column name="name" length="50" not-null="true" />
        </property>
        <property name="description" type="string">
            <column name="description" length="150" />
        </property>
        <set name="childrenCategories" cascade="save-update" inverse="true">
            <key column="parent"/>
            <one-to-many class="ProductCategory"/>
        </set>
        <many-to-one name="parentCategory" column="parent" 
            class="ProductCategory" 
            cascade="save-update"
         >
        </many-to-one>
    </class>
</hibernate-mapping>

测试代码:

category2.getChildrenCategories().remove(category5);
        category5.setParentCategory(null);
        dao.removeProductCategory(category5.getId());

解决方案如下:
方法1 删除Set方的cascade
方法2 解决关联关系后,再删除 :

category2.getChildrenCategories().remove(category5);
        category5.setParentCategory(null);
        dao.removeProductCategory(category5.getId());

方法3 在many-to-one方增加cascade 但值不能是none

如果以上三个方案都失败(哼哼~ 我用了5个小时才找出来的)
检查一下hashCode equals是否使用了id作为唯一标示的选项了;我用uuid.hex时是没有问题的;
但是用了native,就不行了,怎么办?删除啊!

也就是问题出现在本文给出的持久化类的hashCode equals方法身上

hibernate注解的CascadeType属性

cascade表示级联操作

CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法

CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据

CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法

CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法

CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)

CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化)

CascadeType.REMOVE只有A类删除时,会级联删除B类;

CascadeType.ALL包含所有;

CascadeType.REFRESH没用过。

综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错,用CascadeType.ALL时要斟酌下CascadeType.REMOVE

@Fetch:

定义了加载关联关系的获取策略. FetchMode 可以是

SELECT (在需要加载关联的时候触发select操作), SUBSELECT(只对集合有效,使用了子查询策略,详情参考Hibernate参考文档)

JOIN (在加载主实体(owner entity)的时候使用SQL JOIN来加载关联关系).

JOIN 将覆写任何延迟属性 (通过 JOIN策略加载的关联将不再具有延迟性).

hibernate CasCade deleted object ould be re-saved by cascade的更多相关文章

  1. org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade 解决方案 (网络转载)

    前提是配置了cascade=all,依然报这种错误,其实出现这个错误的大多数情况根本不是像网上的帖子所说的是什么级联删除的问题,而且hibernate session关于实体生命周期操作的原因,这里明 ...

  2. 解决hibernate删除时的异常 deleted object would be re-saved by cascade (remove deleted object from associa

    今天在做项目时,需要删除一个对象,由于关联关系是一对多和多对一的关系,于是在代码中需要删除多的一方的对象时出现了 deleted object would be re-saved by cascade ...

  3. NHibernate删除数据时遇到deleted object would be re-saved by cascade级联问题

    今天在处理数据时遇到了这个问题,数据是一对多的关系,A包含多个B,想将某个B从A中移除,在保存时抛出如标题的问题,查找了下资料得知:由于在配置文件中设置了cascade为all,A和B存在级联关系,那 ...

  4. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...

  5. Hibernate级联操作和载入机制(二) cascade and fetch

    上一篇介绍了Hibernate持久化对象时候的级联操作.本篇介绍读取时候的级联操作. 还是用上一篇的样例.一份问卷有多个问题.可是每一个问题仅仅能属于一份问卷. 我们先看測试用例: @Test pub ...

  6. Hibernate 一对一、一对多、多对多注解cascade属性的总结

    作用:是否级联被注解字段里面的对象.可选值:javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL.可选其 ...

  7. Hibernate的数据删除,更改

    其他未给出代码,请参考上一篇.... 一.数据的删除 方法1.从“多”的一方进行数据的删除 books.hbm.xml文件不变: <many-to-one name="publishe ...

  8. spring+hibernate常见异常集合

    spring+hibernate出错小结: (1)java.lang.NoClassDefFoundError: org/hibernate/context/CurrentSessionContext ...

  9. Hibernate常见错误整理

    Hibernate常见错误合集   1.错误:object references an unsaved transient instance - save the transient instance ...

随机推荐

  1. Js 中实现重定向的几种方式

    之所以要总结这个,是因为在项目中使用了 AJAX,当请求成功时需要重定向到另一个页面. 1 . <script type="text/javascript"> wind ...

  2. 第136天:Web前端面试题总结(理论)

    Web前端面试题总结 HTML+CSS理论知识 1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服 ...

  3. 集合里面的 E是泛型 暂且认为是object

    集合里面的 E是泛型 暂且认为是object

  4. 【bzoj3119】Book 数学

    题目描述 一个长度为N的序列的首项为X,以后的每一项要么比前一项大A,要么比前一项小B.已知总和为M,求一组可行方案. 输入 第一行一个正整数N.第二行四个整数依次是X,A,B,M. 输出 输出一行N ...

  5. pbuilder编译构建工具分析

    1. 简介 pbuilder(personal Debian package builder)是ubuntu环境下维护debian包的专业工具,能够为每个deb包创建纯净的编译构建环境,自动解析和安装 ...

  6. 【BZOJ4828】【HNOI2017】大佬(动态规划)

    [BZOJ4828][HNOI2017]大佬(动态规划) 题面 BZOJ 洛谷 LOJ 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场 就能让周围 ...

  7. 安装cacti监控系统

    1 安装snmp [root@xxxx ~]# yum -y install net-snmp* 2 安装rddtool 3 创建数据库 cacti, 导入 cd xx/cacti/cacti.sql ...

  8. [学习笔记]kruskal重构树 && 并查集重构树

    Kruskal 重构树 [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树 kruskal是一个性质优秀的算法 加入的边是越来越劣的 科学家们借这个特点尝试搞一点事 ...

  9. 【codechef】Children Trips

    Portal -->CC_Children Trips Solution (英文题解看得真爽qwq不过写的好详细啊ovo) 首先这题有一个很重要的条件就是边权是\(1\)或者\(2\),所以虽然 ...

  10. Oracle中用exp/imp命令参数详解【转】

    Oracle中用exp/imp命令参数详解 [用 exp 数 据 导 出]:1  将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中   exp sy ...