亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號