Как правильно удалить отношения многие ко многим в Java Spring? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть много-много отношений между событиями и пользователями.Я сделал модель Event владельцем отношения, объявив mappedby () в модели User.Я могу удалить Users из переменной модели Event, и это прекрасно работает при отладке.

Событие:

@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 голосов
/ 02 февраля 2019

Вам необходимо сохранить изменения в БД, используя SpringData или EntityManager.Вам нужно сохранить и сбросить изменения, и это вызовет действия по удалению.

Если изменение не сохраняется должным образом в БД, вам может потребоваться аннотировать метод удаления с помощью @Transactional из пакета Spring.,

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

eventRepository.saveAndFlush(event);

Кроме того, имейте в виду, что списки должны быть синхронизированы таким образом, что если вы удаляете пользователя из события, событие должно быть удалено от пользователя.

Исходя из моего опыта, лучше использовать промежуточную таблицу с идентификатором, чтобы сохранить отношения многие ко многим.Таким образом, вы можете отслеживать такие атрибуты, как createdAt, updatedAt или createdBy, modifiedBy.Наибольшим преимуществом является то, что тогда оно становится отношениями один-ко-многим от User до UserEvent и от Event до UserEvent, и вы можете создать UserEventRepository и выполнять оптимизированные запросы, такие как findByUser(User u) или findByEvent(Event e).

И, с точки зрения производительности, лучше использовать Set, а не List.Hibernate будет запускать меньше запросов на обновление.Просто попробуйте на Блог Влада Михалча

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...