测试Hibernate@Check约束时无法生成约束冲突异常

2022-04-08 00:00:00 java spring-boot h2 Hibernate jpa

我正在使用Hibernate@Check批注,但不能让我的测试在不满足约束时失败。当前仅对H2数据库使用默认的Spring启动配置。

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

运行测试时,我看到正确创建了表。如果我从日志中复制创建行,并使用它在我的"真正的"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约束(id bigint非空,a varchar(255),b Varchar(255),主键(Id),检查(a不为空或b不为空 空))

存储库(在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-已回滚用于测试的事务:
...
测试异常=[空],

因此,出于某种原因,该错误只是被包装和记录。如何在使用仓库持久化时进行解包和抛出?


解决方案

感谢codemonkey中的answer我能够找到解决方案。这可以通过添加:

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

到我的测试类。

相关文章