У меня есть 2 сущности (Пользователь, NewsItem) и отношение многие ко многим (AccessedBy) между их идентификаторами
Вот пользовательский объект: -
@Entity
@Table(name = "news_user")
public class User {
private UUID id;
private Set<AccessedBy> accessors = new HashSet<AccessedBy>();
@Id
@Column(name = "id")
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
@OneToMany(mappedBy = "user", cascade = {CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval = true)
public Set<AccessedBy> getAccessors() {
return accessors;
}
public void setAccessors(Set<AccessedBy> accessors) {
this.accessors = accessors;
}
}
Вот объект новостей: -
@Entity
@Table(name = "news_item")
public class NewsItem {
private UUID id;
private Set<AccessedBy> accessors = new HashSet<>();
@Id
@Column(name = "id")
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
@OneToMany(mappedBy = "newsItem", cascade = {CascadeType.MERGE, CascadeType.DETACH}, orphanRemoval = true)
public Set<AccessedBy> getAccessors() {
return accessors;
}
public void setAccessors(Set<AccessedBy> accessors) {
this.accessors = accessors;
}
}
Вот отношения между ними (AccessedBy): -
@Entity
@Table(name = "accessed_by")
@IdClass(AccessedById.class)
public class AccessedBy {
private User user;
private NewsItem newsItem;
private Boolean bookmarked;
private Boolean read;
private Boolean deleted;
@Id
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Id
@ManyToOne
@JoinColumn(name = "news_id", referencedColumnName = "id")
public NewsItem getNewsItem() {
return newsItem;
}
public void setNewsItem(NewsItem newsItem) {
this.newsItem = newsItem;
}
@Column(name = "bookmarked", nullable = false)
public Boolean getBookmarked() {
return bookmarked;
}
public void setBookmarked(Boolean bookmarked) {
this.bookmarked = bookmarked;
}
@Column(name = "read", nullable = false)
public Boolean getRead() {
return read;
}
public void setRead(Boolean read) {
this.read = read;
}
@Column(name = "deleted", nullable = false)
public Boolean getDeleted() {
return deleted;
}
public void setDeleted(Boolean deleted) {
this.deleted = deleted;
}
}
Допустим, пользователь хочет добавить в закладки новость. Для закладки я записываю запись в таблицу AccessedBy со свойством закладки, установленным в true. И я хочу удалить запись из таблицы AccessedBy на случай, если пользователь отменит ее. Как я могу сделать это эффективно?
Что я пробовал: -
Я попытался удалить объект AccessedBy, который я вставил ранее, из HashSet обеих сущностей, но объект не удаляется, как видно из отладки.
Как я пытаюсь удалить: -
User user = checkUser(authorization);
NewsItem newsItem = newsRepository.findByUniqueId(newsId);
AccessedBy accessedBy = new AccessedBy(user, newsItem, true, false, false);
user.getAccessors().remove(accessedBy);
newsItem.getAccessors().remove(accessedBy);
userRepository.saveAndFlush(user);
newsRepository.saveAndFlush(newsItem);
checkuser () проверяет базовую аутентификацию и возвращает пользователя из базы данных.