@Biaci_Anj

Как в данном случае происходит удаление взаимосвязи в Hibernate?

Как происходит удаление в Hibernate в данном примере?
@Test
    @DisplayName("отсоединение книги от автора")
    public void whenDeleteAuthorFromBook_thenOneDeleteStatement() {
        Author author = authorRepository.findByName("a1");
        Book book = bookRepository.findByName("b1");
        author.removeBook(book);
    }

Я думал, мы должны обратиться к репозиторию, чтобы что-то удалить. А тут мы просто убрали объект из коллекции, которая имеет ManyToMany аннотацию.
Или Hibernate запомнит и удаление произойдет следующий раз, когда я вызову DB из репозитория? Если это так, то как это согласовываться из другими методами, которые работают получением данных из DB, не получат ли они данные с удаленной книгой?

Entitty Author
@NoArgsConstructor
@Data
@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private String name;
    public Author(String name){
        this.name=name;
    }
    @ManyToMany (cascade = {
        CascadeType.PERSIST,
                CascadeType.MERGE
    })
    @JoinTable(name = "author_book",
            joinColumns = @JoinColumn(name = "author_id"),
            inverseJoinColumns = @JoinColumn(name = "book_id")
    )
    private List<Book> books=new ArrayList<>();
    public void addBook(Book book){
        this.books.add(book);
        book.getAuthors().add(this);
    }
    public void removeBook(Book book){
        this.books.remove(book);
        book.getAuthors().remove(this);
    }
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (!(o instanceof Author)) return false;
        return id != null && id.equals(((Author) o).getId());
    }
    @Override
    public int hashCode() {
        return 31;
    }
}

Entity Book
@NoArgsConstructor
@Data
@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    private String name;
    @ManyToMany(mappedBy = "books")
    private Set<Author> authors=new HashSet<>();
    public Book(String name){
        this.name=name;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (!(o instanceof Author)) return false;
        return id != null && id.equals(((Book) o).getId());
    }
    @Override
    public int hashCode() {
        return 31;
    }
}
  • Вопрос задан
  • 19 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы