[英]How to correctly delete a many to many relationship in java spring?
我在事件和用户之间有很多关系。 我通过在用户模型中声明mapbyby()使事件模型成为关系的所有者。 我可以从“事件”模型变量中删除“用户”,并且在调试时可以正常工作。
事件:
@Entity
public class Event {
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(
name = "event_registrations",
joinColumns = @JoinColumn(name="event_id", referencedColumnName =
"id"),
inverseJoinColumns = @JoinColumn(name = "user_id",
referencedColumnName = "id"))
private List<User> userList;
}
public void registerUser(User user){
this.userList.add(user);
}
public void removeUsers(ArrayList<Integer> userIds){
for(int userId: userIds){
this.userList.removeIf(user -> user.getId() == userId);
}
}
用户:
@Entity
public class User {
@ManyToMany(fetch = FetchType.LAZY,
cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
},
mappedBy = "userList")
@JsonIgnore
private List<Event> eventRegistrations;
public void addEventRegistration(Event event) {
this.eventRegistrations.add(event);
}
public void removeEventRegistration(long eventId){
this.eventRegistrations.removeIf(event -> event.getId() == eventId);
}
}
执行从事件中删除用户的代码:
Event event = eventService.getEventById(id);
event.removeUsers(userIds);
我目前唯一的问题是,即使userList变量已更新,这些更改也不会保存到数据库中。
任何帮助表示赞赏!
您需要使用SpringData或EntityManager
将更改持久保存到数据库。 您需要保存并刷新更改,这将触发删除操作。
如果更改未正确保留在数据库中,则可能需要在spring软件包中使用@Transactional
注释delete方法。
Event event = eventService.getEventById(id);
event.removeUsers(userIds);
eventRepository.saveAndFlush(event);
另外,请记住,列表应该处于同步状态,这样可以从事件中删除用户,然后从用户中删除事件。
根据我的经验,最好使用带有ID的中间表来保持多对多关系。 这样,您就可以跟踪喜欢的属性createdAt
, updatedAt
或createdBy
, modifiedBy
。 最大的好处是,它变成了从User
到UserEvent
以及从Event
到UserEvent
一对二关系,您可以创建UserEventRepository
并进行优化的查询,例如findByUser(User u)
或findByEvent(Event e)
。
而且,从性能角度来看,最好使用Set
而不是List
。 Hibernate将触发较少的查询以进行更新。 在Vlad Mihalcea的博客上稍作休息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.