Rumah > pangkalan data > tutorial mysql > Hibernate:deleted object would be re-saved by cascade (remov

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

WBOY
Lepaskan: 2016-06-07 14:50:09
asal
1340 orang telah melayarinya

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>
Salin selepas log masuk

可见是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、当然,扎实基础是关键。

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan