我在删除条目时遇到约束违规异常
我有关系表TransportationEvent和结论
relation islike
@Entity
public class TransportationEvent {
...
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Conclusion> conclusions = new ArrayList<Conclusion>();
...
}
@Entity
public class Conclusion {
....
@ManyToMany( fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<TransportationEvent> transportationEvents = new ArrayList<TransportationEvent>();
....
}
这里在数据库中我有另外两个表,如
结论_TransportationEvent和TransportationEvent_Conclusion
这里我的要求是我需要删除两个表中的记录(TransportationEvent和结论)
这里我试图删除结论表记录,如下:
removeConclusions(conclusion.getId());
public void removeConclusions(Long id) {
entityManager = dbConn.getConnection();
Conclusion conclusion = entityManager.find(Conclusion.class, id);
entityManager.getTransaction().begin();
entityManager.remove(conclusion);
entityManager.getTransaction().commit();
}
但是我遇到了约束违规错误。
引起:java.sql.SQLException:DELETE语句与REFERENCE约束“FK30CDAB072AAE439”冲突。冲突发生在数据库“ECT”,表“dbo.TransportationEvent_Conclusion”,列'ending_id'
通过搜索一些论坛,我得到了像
这样的语法@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
我将其应用为
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<Conclusion> conclusions = new ArrayList<Conclusion>();
@ManyToMany( fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<TransportationEvent> transportationEvents = new ArrayList<TransportationEvent>();
在两个实体中即使我发现同样的约束违规
有些人可以帮助我如何使用它来删除结论和TransportationEvent中的记录。
提前致谢!
答案 0 :(得分:6)
您发现了问题,但没有解决问题:您不应该有两个不同的连接表来保存TransportationEvent和结论之间的关联。你应该只有一个。
您尚未定义单个双向ManyToMany关联,而是两个单独的单向ManyToMany关联。在双向关联中,一方必须始终是另一方的反面,即所有者方。反面必须具有mappedBy
属性。因此,如果您选择TransportationEvent作为所有者方,则映射应为:
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Conclusion> conclusions = new ArrayList<Conclusion>();
和
@ManyToMany(mappedBy = "conclusions" fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<TransportationEvent> transportationEvents = new ArrayList<TransportationEvent>();
现在,为了使关联失败,你必须简单地从事件结论清单中删除结论。最好还是从结论事件列表中删除事件,以获得连贯的对象图,但Hibernate并不关心反面。只是关于业主方。
一旦结果从其事件中删除,它就不再被引用,您可以将其从数据库中删除。