Многие ко многим Spring Jpa Delete не работает - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в Spring jpa и пытаюсь выполнить операцию удаления в базе данных spring jpa многих ко многим. В моей базе есть пользователь и наркотик. Я могу удалить пользователя и удалить также связанные с ним строки из таблицы user_drug. Я могу удалить лекарство, которое не имеет связи с таблицей user_drug, но я не могу удалить лекарство, которое также находится в таблице user_drug. Я посмотрел на этой странице, но решения оттуда не работают для меня .. Как удалить сущность с отношением ManyToMany в JPA (и соответствующие строки таблицы соединения)?

Вот мой код для сущности пользователя:

 @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
 @JoinTable(name = "user_drug",
        joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "drug_id", referencedColumnName = "id"))
 private Set<Drug> drugs = new HashSet<>();

Вот код для сущности Drug:

 @ManyToMany(mappedBy = "drugs",  fetch=FetchType.EAGER)
 private Set<User> users = new HashSet<>();

А вот метод удаления из DrugServiceImpl:

public void delete(Drug drug)
{
    drug.getUsers().clear();
    drugRepository.delete(drug);
}

Я также напечатал размер drug.getUsers () после сброса, и он равен 0. Почему он не удаляет лекарство из базы данных?
Я пробовал разными способами. Может кто-нибудь отправить какую-нибудь помощь?

1 Ответ

0 голосов
/ 09 апреля 2020

так работает каскад, он удаляет только из таблицы отношений, а в таблице ManyToMany здесь есть таблица user_drug

, и для этих случаев существует множество решений, одно из которых удаление drug в той же транзакции, что и удаление user

, но другое решение, которое сэкономит усилия, связанные с созданием таблицы ManyToMany в качестве сущности и каскадом объекта drug в таблица отношений

вот так

Но это в User сущности

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="user")
private Set<UserDrug> drugs = new HashSet<>();

UserDrug сущности

public class UserDrug {
    @ManyToOne
    @JoinColumn(name="user_id")
    User user;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="drug_id")
    Drug drug;

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