我有这种情况(使用springMVC + hibernate):
一个“价目表”记录由一个“服务”和一个“公司”制作:
PriceList类:
//Many to one with Company
@NotNull(message = "....")
@ManyToOne
@JoinColumn(name = "company_id", referencedColumnName="id", nullable=false)
private Company company;
//Many to one with Service
@NotNull(message = "....")
@ManyToOne
@JoinColumn(name = "service_id", referencedColumnName="id", nullable=false)
private Service service;
服务类:
@OneToMany(mappedBy="service", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private Set<PriceList> priceList;
公司类:
@OneToMany(mappedBy="company", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Company> company;
我的问题是当我尝试删除PriceList时:
没有EAGER一切都很好,
但如果我保留CascadeType.ALL和FetchType.EAGER,我会收到此错误:
org.springframework.web.util.NestedServletException:Request 处理失败;嵌套异常是 org.springframework.dao.InvalidDataAccessApiUsageException:已删除 对象将通过级联重新保存(从中删除已删除的对象) 协会): 嵌套异常是 org.hibernate.ObjectDeletedException:已删除的对象将被重新保存 通过级联(从关联中删除已删除的对象)
我不明白为什么我会收到此错误...如果我想删除“priceList”记录,我认为没有任何问题。
我认为在删除我的记录之前我应该刷新或类似的东西......
我删除了公司或服务,一切都很好,因为PriceList中的记录也被删除了。
非常感谢您的任何建议
答案 0 :(得分:1)
在处理双向关联并且您想要添加/删除子项时,您应该在父实体中使用这些方法:
public void addChild(Child child) {
children.add(child);
child.setParent(this);
}
public void removeChild(Child child) {
children.remove(child);
child.setParent(null);
}
删除会破坏父/子和子/父关联。
答案 1 :(得分:0)
我发现,在删除PriceList记录之前,我必须将它从公司的PriceList集合中删除(因为在内存中使用EAGER加载所有PriceList):
priceList_removing.getCompany().getPriceLists().remove(priceList_removing);
getCurrentSession().delete(priceList_removing);