Heim >Datenbank >MySQL-Tutorial >Hibernate:deleted object would be re-saved by cascade (remov

Hibernate:deleted object would be re-saved by cascade (remov

WBOY
WBOYOriginal
2016-06-07 14:50:091338Durchsuche

Hibernate多表关联的时候的异常:deleted object would be re-saved by cascade (remove deleted object from associations): []。 【产生原因】 表之间的一对多(多对一)关联,两种情况:双表一对多多对一,单表自关联一对多多对一。表现为:删除“多”的

Hibernate多表关联的时候的异常:deleted object would be re-saved by cascade (remove deleted object from associations): []。
【产生原因】表之间的一对多(多对一)关联,两种情况:双表一对多多对一,单表自关联一对多多对一。表现为:删除“多”的一方的条目的时候出现这个异常。
【具体环境背景】楼主是在单表自关联(双向一对多多对一)出现的,建表细节:

<code class=" hljs java"><span class="hljs-annotation">@Entity</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Department</span> {</span>

    <span class="hljs-keyword">private</span> Long id;
    <span class="hljs-keyword">private</span> Set<User> users = <span class="hljs-keyword">new</span> HashSet<User>();
    <span class="hljs-keyword">private</span> Department parent;
    <span class="hljs-keyword">private</span> Set<Department> children = <span class="hljs-keyword">new</span> HashSet<Department>();
    <span class="hljs-keyword">private</span> String name;
    <span class="hljs-keyword">private</span> String description;

    <span class="hljs-annotation">@Id</span>
    <span class="hljs-annotation">@GeneratedValue</span>
    <span class="hljs-keyword">public</span> Long <span class="hljs-title">getId</span>() {
        <span class="hljs-keyword">return</span> id;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setId</span>(Long id) {
        <span class="hljs-keyword">this</span>.id = id;
    }
    <span class="hljs-annotation">@ManyToOne</span>(cascade=CascadeType.MERGE)
    <span class="hljs-annotation">@JoinColumn</span>(name=<span class="hljs-string">"parent_id"</span>)
    <span class="hljs-keyword">public</span> Department <span class="hljs-title">getParent</span>() {
        <span class="hljs-keyword">return</span> parent;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setParent</span>(Department parent) {
        <span class="hljs-keyword">this</span>.parent = parent;
    }

    <span class="hljs-annotation">@OneToMany</span>(mappedBy=<span class="hljs-string">"parent"</span>,cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    <span class="hljs-keyword">public</span> Set<Department> <span class="hljs-title">getChildren</span>() {
        <span class="hljs-keyword">return</span> children;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setChildren</span>(Set<Department> children) {
        <span class="hljs-keyword">this</span>.children = children;
    }
}</code>

可见是Department部门表的自关联,每个部门都有一个上级部门和一个下级部门。我们理想状态的删除是:删除一个部门,1、它所有的下级部门级联删除,2、所有的上级部门不发生任何变化。
【解决方法!!!】由异常信息得知:deleted object would be re-saved by cascade (remove deleted object from associations)—->删除掉的对象将会被级联第二次保存(从绑定的联系上移除已经被删除的对象)。这说明我们已经做到了删除但是却由于级联(cascade)的原因,删除的对象又被利用了等等……,所以要做的是解决办法是:把@OneToMany里的cascade=CascadeType.ALL改成cascade=CascadeType.REMOVE。其他无关。
**【总结】**1、善于阅读思考异常内容。
2、cascade=CascadeType.ALL慎用,无论是在Many的一方还是One的一方。
3、当然,扎实基础是关键。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn