Как эффективно удалить из таблицы соединения с дополнительными столбцами в данных весны jpa? - PullRequest
2 голосов
/ 18 марта 2019

У меня есть 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 () проверяет базовую аутентификацию и возвращает пользователя из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...