繁体   English   中英

如何在Java Spring中正确删除多对多关系?

[英]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的中间表来保持多对多关系。 这样,您就可以跟踪喜欢的属性createdAtupdatedAtcreatedBymodifiedBy 最大的好处是,它变成了从UserUserEvent以及从EventUserEvent一对二关系,您可以创建UserEventRepository并进行优化的查询,例如findByUser(User u)findByEvent(Event e)

而且,从性能角度来看,最好使用Set而不是List Hibernate将触发较少的查询以进行更新。 Vlad Mihalcea的博客上稍作休息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM