Как происходит удаление в 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;
}
}