为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-06-04 15:14:47
我在事件和用户之间有多对多的关系。我通过在 User 模型中声明mappedby()使 Event 模型成为关系的所有者。我可以从事件模型变量中删除用户,这在调试时工作正常。事件:@Entitypublic 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);    }}用户:@Entitypublic 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变量得到了更新。任何帮助表示赞赏!
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您需要使用 SpringData 或使用EntityManager. 您需要保存并刷新更改,它将触发删除操作。


如果更改未正确保存在 DB 中,您可能需要使用@Transactionalspring 包中的 delete 方法进行注释。


Event event = eventService.getEventById(id);

event.removeUsers(userIds);


eventRepository.saveAndFlush(event);

另外,请记住,列表应该是同步的,如果您从事件中删除用户,则应该从用户中删除该事件。


根据我的经验,最好使用带有 ID 的中间表来保持多对多关系。通过这种方式,您可以跟踪createdAt,updatedAt或createdBy,等属性modifiedBy。User最大的优点是它变成了从toUserEvent和 from Eventto的两个一对多关系UserEvent,您可以创建一个UserEventRepository并进行优化查询,例如findByUser(User u)or findByEvent(Event e)。


而且,从性能角度来看,最好使用Set而不是List. Hibernate 将触发较少的更新查询。只需在Vlad Mihalcea 的博客上了解一下


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 355 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号