簡體   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