Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何从jpa中具有多对多关系的jointable中删除记录_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

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

Hibernate 如何从jpa中具有多对多关系的jointable中删除记录,hibernate,jpa,jpa-2.0,Hibernate,Jpa,Jpa 2.0,我在删除条目时收到约束冲突异常 我有运输事件和结论的关系表 关系相似 @Entity public class TransportationEvent { ... @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST) private List<Conclusion> conclusions = new ArrayList<Conclusion>(); ... } @Enti

我在删除条目时收到约束冲突异常

我有运输事件和结论的关系表

关系相似

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

....

}
但我得到了约束冲突错误

原因:java.sql.SQLException:DELETE语句与引用约束“FK30CDAB072AAE439”冲突。冲突发生在数据库“ECT”、表“dbo.TransportationEvent\u Conclusion”列“conclusions\u 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>();
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
私有列表结论=新的ArrayList();
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE\u孤儿)
私有列表transportationEvents=new ArrayList();
在两个实体中,即使我遇到相同的约束冲突

有人能帮我如何准确地使用它来删除Conclusion和TransportationEvent中的记录吗


提前谢谢

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

您没有定义单个双向多人关联,而是定义了两个单独的单向多人关联。在双向关联中,一侧必须始终是另一侧的反向侧,即所有者侧。反向侧必须具有
mappedBy
属性。因此,如果选择TransportationEvent作为所有者端,则映射应为:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<Conclusion> conclusions = new ArrayList<Conclusion>();
@ManyToMany(fetch=FetchType.EAGER,cascade=CascadeType.PERSIST)
私有列表结论=新的ArrayList();

@ManyToMany(mappedBy=“conclusions”fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
私有列表transportationEvents=new ArrayList();
现在,要建立关联,您只需从事件的结论列表中删除该结论。最好也从结论的事件列表中删除事件,以获得一致的对象图,但Hibernate并不关心相反的方面。只是关于所有者方面

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

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