【发布时间】:2015-07-04 18:02:11
【问题描述】:
我的数据库中有多对多关系(实体是参与者和事件)
//part of participant model
@ManyToMany(fetch = FetchType.LAZY , cascade = { CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "participant_event",
joinColumns = {@JoinColumn(name = "participant_id")},
inverseJoinColumns = {@JoinColumn(name = "event_id")})
//part of event model
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "events", cascade = CascadeType.ALL)
就在此时,删除一个活动会导致删除所有要访问该活动的参与者。删除事件模型中的CascadeType.ALL 会导致删除事件后没有结果(删除我的意思是.remove)。仅删除 Event 并保留所有参与者的正确方法是什么?
代码是here
【问题讨论】:
-
移除级联至少应该导致删除 SQL 查询被执行。它可能会失败,从而导致抛出异常,因为参与者仍在引用被删除的事件。解决方法很简单:从所有参与者中删除该事件,然后删除该事件。
-
在删除事件之前调用
flush()。这将强制 Hibernate 在从事件表中删除之前从连接表中删除。 -
@JBNizet 现在注意到了一件奇怪的事情——我用
event_id=1、flush()从字段中清除了participant_event 表,尝试使用id=1 的.remove(event)并显示Key (event_id)=(3) is still referenced from table participant_event(不是event_id=1!!)。但是如果我从函数中return event;它只返回一个带有event_id=1的事件,它可以是带有 FetchType 的东西吗? -
事件之间还有其他关联吗?你能发布完整的 Event 类,以及你用来删除它的完整代码吗?
-
代码应该在问题本身中。我注意到你仍然没有调用flush(),甚至没有调用remove()。您还与 Task 有关联,并且 Task 再次具有具有级联 ALL 的 ManyToOne,这意味着删除任务将尝试删除任务的事件。这没有意义。
标签: java database hibernate jpa many-to-many