gpt4 book ai didi

java - java spring中如何正确删除多对多关系?

转载 作者:行者123 更新时间:2023-12-02 10:18:38 24 4
gpt4 key购买 nike

事件和用户之间存在多对多关系。我通过在用户模型中声明 mappedby() 使事件模型成为关系的所有者。我可以从事件模型变量中删除用户,这在调试时效果很好。

事件:

@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 注释删除方法。

Event event = eventService.getEventById(id);
event.removeUsers(userIds);

eventRepository.saveAndFlush(event);

此外,请记住,列表应处于同步状态,这样,如果您从事件中删除用户,则该事件也应从该用户中删除。

根据我的经验,最好使用带有 ID 的中间表来保存多对多关系。通过这种方式,您可以跟踪 createdAtupdatedAtcreatedBymodifiedBy 等属性。最大的好处是,那么从UserUserEvent和从EventUserEvent就变成了两个一对多的关系您可以创建一个 UserEventRepository 并进行优化查询,例如 findByUser(User u)findByEvent(Event e)

而且,从性能角度来看,最好使用 Set 而不是 List。 Hibernate 将触发更少的更新查询。只需调用 Vlad Mihalcea' Blog 即可获得簧片

关于java - java spring中如何正确删除多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54495020/

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