我的数据库中有多对多的关系(实体是参与者和事件)
//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
答案 0 :(得分:2)
在多对多关联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);