gpt4 book ai didi

java - 测试 Hibernate @Check 约束时无法生成约束违反异常

转载 作者:行者123 更新时间:2023-11-29 07:25:48 26 4
gpt4 key购买 nike

我正在使用 Hibernate @Check 注释,但是不能让我的测试在约束不满足时失败。目前仅使用带有 H2 数据库的默认 Spring 引导配置。

我错过了什么? save(..) 之后是否应该有某种flush

运行测试时,我看到表已正确创建。如果我从日志中复制创建行并使用它创建一个表到我的“真实”Postgres 数据库,我可以测试不同的插入并看到该行在约束条件下一切正常。

实体

@Getter @Setter
@Entity @Check(constraints = "a IS NOT NULL OR b IS NOT NULL")
public class Constrained {

@Id @GeneratedValue
private Long id;

private String a, b;
}

测试

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

@Resource // this repo is just some boiler plate code but attached at
// the bottom of question
private ConstrainedRepository repo;

@Test @Transactional // also tried without @Transactional
public void test() {
Constrained c = new Constrained();
repo.save(c); // Am I wrong to expect some constraint exception here?
}
}

运行测试时的表生成脚本

create table constrained (id bigint not null, a varchar(255), b varchar(255), primary key (id), check (a IS NOT NULL OR b IS NOT NULL))

Repository(在 repo 中没什么可看的,只是为了展示它):

public interface ConstrainedRepository
extends CrudRepository<Constrained, Long> {
}

然而

如果我使用 EntityManager 所以添加到我的测试类:

@PersistenceContext
private EntityManager em;

并像这样坚持下去:

em.persist(c);
em.flush();

我将得到异常而不是 repo.save(c)

使用 repo.save(c) 研究原始测试的日志,更仔细地显示:

org.springframework.test.context.transaction.TransactionContext:139 - Rolled back transaction for test:
...
testException = [null],

所以出于某种原因,这个错误只是被包装并记录下来。如何在使用存储库进行持久化时“展开”并抛出?

最佳答案

感谢 answercodemonkey 我找到了解决方案。这通过添加解决:

@org.springframework.transaction.annotation.Transactional(propagation = 
Propagation.NOT_SUPPORTED)

到我的测试课。

关于java - 测试 Hibernate @Check 约束时无法生成约束违反异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53237507/

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