Java Can';我不太明白如何使用Hibernate正确删除字段

Java Can';我不太明白如何使用Hibernate正确删除字段,java,database,hibernate,jpa,many-to-many,Java,Database,Hibernate,Jpa,Many To Many,我的数据库中有多对多关系(实体是参与者和事件) 此时,删除事件会导致删除所有要访问此事件的参与者。删除CascadeType。事件模型中的所有在删除事件后不会产生任何结果(我指的是删除。删除)。什么是只删除活动并保留所有参与者的正确方法 代码是多对多关联中的,因为它删除了实际实体(而不仅仅是它们关联的链接表条目) 删除关联的正确方法是分离实体: public void removeEvent(Event event) { events.remove(event); event.s

我的数据库中有多对多关系(实体是参与者和事件)

此时,删除事件会导致删除所有要访问此事件的参与者。删除
CascadeType。事件模型中的所有
在删除事件后不会产生任何结果(我指的是删除
。删除
)。什么是只删除活动并保留所有参与者的正确方法


代码是多对多关联中的

,因为它删除了实际实体(而不仅仅是它们关联的链接表条目)

删除关联的正确方法是分离实体:

public void removeEvent(Event event) {
    events.remove(event);
    event.setParticipant(null);
}
要删除
事件
,您必须从所有
参与者
中删除。为此,您必须执行以下操作:

Event deletableEvent = ...;

for(Iterator<Participant> participantIterator = event.getParticipnts(); participantIterator.hasNext();) {
    Participant participant = participantIterator.next();
    participant.getEvents().remove(deletableEvent);
    participantIterator.remove();
}

entityManager.flush();
entityManager.remove(deletableEvent);
Event deletableEvent=。。。;
for(迭代器participantIterator=event.getparticipants();participantIterator.hasNext();){
Participant=participantIterator.next();
participant.getEvents().remove(deletableEvent);
participationiterator.remove();
}
entityManager.flush();
entityManager.remove(可删除事件);

删除级联至少会导致执行删除SQL查询。它可能会失败,并因此引发异常,因为参与者仍在引用要删除的事件。解决方法很简单:从所有参与者中删除事件,并在删除事件之前删除event.call
flush()
。这将迫使Hibernate在从事件表中删除之前先从联接表中删除。@jbnite现在注意到了一件奇怪的事情-我用
event\u id=1
flush()
,从字段中清除participant\u事件表,试图
。删除id=1的(event)
,并显示
键(event\u id)=(3)仍然从表participant\u event中引用(而不是
event\u id=1
!!)。但是如果我
返回事件
从函数中,它只返回一个具有
event_id=1
的事件,它是否可以是具有FetchType的事件?事件之间是否有其他关联?你能发布完整的事件类,以及你用来删除它的完整代码吗?代码应该在问题中。我注意到您仍然没有调用flush(),甚至没有调用remove()。您还与Task有关联,Task又有一个带有cascade ALL的manyOne,这意味着删除任务将尝试删除任务的事件。这是没有道理的..remove(event)会导致关于仍然存在的引用的相同异常(如果我没有弄错,我们从EntityManager调用此方法),看起来我现在正在做这件事,但出于某种原因,
.remove()
试图删除的不是我试图删除的唯一事件。检查我对问题帖子的评论您需要激活Hibernate SQL日志并将它们粘贴到您的问题中,以及您现在使用的实际代码和实际实体。
Event deletableEvent = ...;

for(Iterator<Participant> participantIterator = event.getParticipnts(); participantIterator.hasNext();) {
    Participant participant = participantIterator.next();
    participant.getEvents().remove(deletableEvent);
    participantIterator.remove();
}

entityManager.flush();
entityManager.remove(deletableEvent);