测试中的Hibernate OnDelete级联不起作用

测试中的Hibernate OnDelete级联不起作用,hibernate,spring-boot,jpa,spring-data-jpa,spring-test,Hibernate,Spring Boot,Jpa,Spring Data Jpa,Spring Test,我有单向相关实体: @Entity public class Book { private String isbn; } @Entity private class Recommentation { @ManyToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "book_id", nullable = false) @OnDelete(action = OnDeleteActio

我有单向相关实体:

@Entity
public class Book {
    private String isbn;
}

@Entity
private class Recommentation {
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "book_id", nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Book book;
}
以及以下测试:

@RunWith(SpringRunner.class)
@DataJpaTest
public class BookRepositoryTest {

    @Autowired
    private TestEntityManager testEntityManager;

    @Autowired
    private BookRepository bookRepository;

    @Test
    public void delete() {
        // given
        String isbn = "isbn-1";
        Book book = new Book();
        book.setIsbn(isbn);
        testEntityManager.persist(book);


        Recommendation recommendation = new Recommendation();
        recommendation.setBook(book);
        testEntityManager.persist(recommendation);

        // when
        bookRepository.deleteBookByIsbn(book.getIsbn());

        // then
        assertThat(testEntityManager.find(Book.class, book.getId())).isNull();
        assertThat(testEntityManager.find(Recommendation.class, recommendation.getId())).isNull();
    }

}
@OnDeleteaction=OnDeleteaction.CASCADE在调用此代码时工作得非常好,但在测试中,我得到一个异常,即该建议未被book删除

此外,我还尝试从为hibernate查询记录的sql中获取任何信息,但我看不到此测试的任何delete语句

我不想对实体使用双向链接,只想了解如何解决这个具体问题或以某种方式调试它

编辑1:

如果您不需要双向映射,并且您的模式是从实体创建的,那么下面的方法应该可以做到这一点

在从SQL创建模式的情况下,也可以在脚本中创建这样一个外键


这种方法还要求只执行一个删除查询。

需要注意的几点:

首先,据我所知@OnDeleteaction=OnDeleteaction.CASCADE只影响DDL生成,即FK是使用on delete CASCADE子句在数据库中创建的。然后将cacing delete委托给数据库,如果您没有让Hibernate生成模式,那么此注释将无效。由于级联删除被委托给数据库,因此您不会看到Hibernate执行任何SQL delete语句

其次,在测试中,使用JPQL查询删除实体:

bookRepository.deleteBookByIsbnbook.getIsbn

而不是通过存储库的deletee方法使用entityManager.removee

这样做的结果是,即使将JPA CacadeType.DELETE应用于关联,删除操作也不会层叠,因为批量JPQL更新/删除查询不会cacade

关于这一点,请参见此处:


也许应该在交易中:我不想在删除推荐时产生副作用,我也不想删除这本书。哦,的确,我没有彻底调查这个问题。在这种情况下,我不确定是否还有其他方法,除了:@onetomanaymappedby=book,orphanRemoving=true relations在您的book实体中。但我也不喜欢双向关系,所以在这种情况下,我在SQL表定义推荐表中的DELETE CASCADE上使用外键,在您的示例中使用book_id外键。
@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "book_id", nullable = false)
private Book book;
@ManyToOne(optional = false)
@JoinColumn(name = "book_id",
        nullable = false,
        foreignKey = @ForeignKey(
                foreignKeyDefinition = "FOREIGN KEY (book_id) REFERENCES book(id) ON DELETE CASCADE"
        )
)
private Book book;