我在事件和用戶之間有多對多的關系。我通過在 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 的博客上了解一下
添加回答
舉報
0/150
提交
取消