使用FetchType.EAGER时出现CascadeType.ALL错误

时间:2014-06-25 13:40:25

标签: java spring hibernate jpa cascade

我有这种情况(使用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中的记录也被删除了。

非常感谢您的任何建议

2 个答案:

答案 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);