2013-05-22 140 views
4

我得到的约束冲突异常得到控制而删除的条目如何从jointable删除记录具有许多在JPA

一对多的关系我有关系表TransportationEvent和结论

关系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>(); 

.... 

} 

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

Conclusion_TransportationEvent and TransportationEvent_Conclus离子

这里我的要求是我需要删除两个表中(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”,列通过搜索一些论坛上我有类似语法

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 

'conclusions_id'

和我申请作为

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

在两个实体中,即使iam geting相同的约束冲突

有人能帮助我如何使用它从Conclus删除记录离子和运输事件。

在此先感谢!

回答

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

而现在,进行关联disppear必须简单地从结论的列表中删除的结论的事件。最好从结论事件列表中删除事件,以获得连贯的对象图,但Hibernate不关心反面。只关于所有者方面。

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