如何正确删除许多在Java春天一对多的关系?

时间:2019-02-02 16:27:08

标签: java spring hibernate many-to-many

我在事件和用户之间有很多关系。通过在用户模型中声明 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 变量已更新,这些更改也不会保存到数据库中。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要使用SpringData或使用EntityManager将更改持久保存到数据库。您需要保存并刷新更改,这将触发删除操作。

如果更改未正确保留在数据库中,则可能需要在spring软件包中使用@Transactional注释delete方法。

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

eventRepository.saveAndFlush(event);

另外,请记住,名单应该是同步的,在某种程度上,如果从事件中删除用户,该事件应该从用户删除。

这是我的经验,最好是使用一个中间表与ID坚持一个多对多的关系。这样,您可以跟踪createdAtupdatedAtcreatedBymodifiedBy之类的属性。最大的优点是,那么它变成了两个一对多的关系,从UserUserEventEventUserEvent,你可以创建一个UserEventRepository,使优化的查询像findByUser(User u)findByEvent(Event e)

而且,从性能角度来看,最好使用Set而不是List。 Hibernate将触发较少的查询以进行更新。只需在Vlad Mihalcea' Blog

放松一下