如何从jt中具有多对多关系的jointable中删除记录

Kir*_*ran 4 hibernate jpa jpa-2.0

删除条目时,我收到约束违规异常

我有关系表TransportationEvent和结论

关系就像

@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>();

....

}
Run Code Online (Sandbox Code Playgroud)

在数据库中,我有另外两个表

结论_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();
}
Run Code Online (Sandbox Code Playgroud)

但我得到约束违规错误.

引发者:java.sql.SQLException:DELETE语句与REFERENCE约束"FK30CDAB072AAE439"冲突.冲突发生在数据库"ECT",表"dbo.TransportationEvent_Conclusion",列'ending_id'

通过搜索一些论坛,我得到了语法

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Run Code Online (Sandbox Code Playgroud)

我把它应用为

@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>();
Run Code Online (Sandbox Code Playgroud)

在两个实体中,即使我发现同样的约束违规

可以有人帮助我如何使用它来删除结论和TransportationEvent中的记录.

提前致谢!

JB *_*zet 6

您确定了问题,但没有解决问题:您不应该有两个不同的连接表来保存TransportationEvent和结论之间的关联.你应该有一个.

您尚未定义单个双向ManyToMany关联,而是两个单独的单向ManyToMany关联.在双向关联中,一方必须始终是另一方的反面,即所有者方.反面必须具有mappedBy属性.因此,如果您选择TransportationEvent作为所有者方,则映射应为:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Conclusion> conclusions = new ArrayList<Conclusion>();
Run Code Online (Sandbox Code Playgroud)

和

@ManyToMany(mappedBy = "conclusions" fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
private List<TransportationEvent> transportationEvents = new ArrayList<TransportationEvent>();
Run Code Online (Sandbox Code Playgroud)

而现在,为了使关联失败,你必须简单地从事件的结论列表中删除结论.最好还是从结论事件列表中删除事件,以获得连贯的对象图,但Hibernate并不关心反面.只有业主方面.

一旦结果从其事件中删除,它就不再被引用,您可以从数据库中删除它.