[英]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的中間表來保持多對多關系。 這樣,您就可以跟蹤喜歡的屬性createdAt
, updatedAt
或createdBy
, modifiedBy
。 最大的好處是,它變成了從User
到UserEvent
以及從Event
到UserEvent
一對二關系,您可以創建UserEventRepository
並進行優化的查詢,例如findByUser(User u)
或findByEvent(Event e)
。
而且,從性能角度來看,最好使用Set
而不是List
。 Hibernate將觸發較少的查詢以進行更新。 在Vlad Mihalcea的博客上稍作休息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.