gpt4 book ai didi

java - 不太明白如何使用 Hibernate 正确删除字段

转载 作者:搜寻专家 更新时间:2023-11-01 03:21:22 24 4
gpt4 key购买 nike

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

//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)。仅删除事件并保留所有参与者的正确方法是什么?

代码是 here

最佳答案

在多对多关联中,CascadeType.REMOVE is not desirable ,因为它删除了实际的实体(而不仅仅是它们关联的链接表条目)。

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

public void removeEvent(Event event) {
events.remove(event);
event.setParticipant(null);
}

要删除Event,您必须从所有Participants 中删除。为此你必须做这样的事情:

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

关于java - 不太明白如何使用 Hibernate 正确删除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29876181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com