首页 > 解决方案 > 在这个例子中,Hibernate 如何删除关系?

问题描述

@Test
@DisplayName("delete book from author")
public void whenDeleteAuthorFromBook_thenOneDeleteStatement() {
    Author author = authorRepository.findByName("a1");
    Book book = bookRepository.findByName("b1");
    author.removeBook(book);
}

我虽然调用存储库时会发生数据库中的任何更改。在这里,我们从 Collection Author 中删除了一个 Object Book(由 ManyToMany 映射)。

Hibernate 是否使用 DataSource 并在删除后立即通过调用 SQL 来删除关系?我非常感谢你的回答!

实体作者

    @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;
    }
}

实体书

  @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;
    }
}

标签: hibernate

解决方案


推荐阅读