信息来源:BlogJava
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)异常的解决
在Hibernate中,删除存在关联关系的一个对象时,会出现 org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)这个异常
如下:
持久化类:


package?org.lizheng.platform.model;
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="org.lizheng.platform.model">
????<class?name="ProductCategory"?table="productcategory"?catalog="lizheng">
????????<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());
仔细分析原因,最容易出现的三点问题是: