gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:00:41 29 4
gpt4 key购买 nike

我有单向相关实体:

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

}

@OnDelete(action = OnDeleteAction.CASCADE) 当此代码不是从测试中调用但在测试中我得到异常,建议未被书删除。

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

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

最佳答案

@ManyToOne#cascade

@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "book_id", nullable = false)
private Book book;

编辑 1:

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

如果您不想要双向映射并且您的模式是从您的实体创建的,则以下方法应该可以解决问题。

如果您从 SQL 创建模式,您也可以在脚本中创建这样的外键。

这种方法也期望只执行一个删除查询。

关于测试中的 Hibernate OnDelete 级联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583707/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com