您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页Hibernate:deletedobjectwouldbere-savedbycascade(remov

Hibernate:deletedobjectwouldbere-savedbycascade(remov

来源:华拓科技网


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): []。
【产生原因】表之间的一对多(多对一)关联,两种情况:双表一对多多对一,单表自关联一对多多对一。表现为:删除“多”的一方的条目的时候出现这个异常。
【具体环境背景】楼主是在单表自关联(双向一对多多对一)出现的,建表细节:

@Entity
public class Department {

 private Long id;
 private Set users = new HashSet();
 private Department parent;
 private Set children = new HashSet();
 private String name;
 private String description;

 @Id
 @GeneratedValue
 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }
 @ManyToOne(cascade=CascadeType.MERGE)
 @JoinColumn(name="parent_id")
 public Department getParent() {
 return parent;
 }

 public void setParent(Department parent) {
 this.parent = parent;
 }

 @OneToMany(mappedBy="parent",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
 public Set getChildren() {
 return children;
 }

 public void setChildren(Set children) {
 this.children = children;
 }
}

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

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务