Spring Boot Starter Data JPA的唯一约束检查 失败太晚了

问题描述 投票:1回答:1

我对这个独特的约束功能感到非常惊讶。我正在开发一个带H2数据库的spring boot应用程序进行单元测试。

我的一个实体有一个独特的约束。在User类的标题下面。

@Entity
@Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = { "identifier" }) })
@SequenceGenerator(name = "user_pkey", sequenceName = "user_id_seq")

我写了一个小单元测试来检查唯一约束。

测试前功能

@Before
public void before() {
        User user1 = new User();
        user1.setBlackListed(false);
        user1.setIdentifier("[email protected]");
        user1.setRefreshToken("azerty");          
        this.userDao.save(user1);
}

我的考试

@Test(expected = DataIntegrityViolationException.class)
public void user_identifierUnicityTest() {
    User user4 = new User();
    user4.setBlackListed(false);
    user4.setIdentifier("[email protected]");
    user4.setRefreshToken("azerty4");
    User response = this.userDao.save(user4);
    this.userDao.findByIdentifier("[email protected]");
}

我很惊讶,我认为在保存请求期间会抛出异常。或者在查找请求期间抛出异常。

在选择请求期间检查约束完整性而不是插入。我不明白结果。

这是唯一约束的正常行为吗?

谢谢你的回答:)

hibernate spring-boot spring-data h2 unique-constraint
1个回答
5
投票

唯一约束由数据库维护。如果违反约束,这将导致insert失败。在必要之前,Hibernate不会将实体写入数据库,当发生这种情况时,它将被称为flushing。当您发出搜索查询时,Hibernate的默认行为是在查询之前进行刷新,以便在查询时可以看到对持久上下文所做的任何更改。

因此,您的更改将作为执行查询的副作用插入到数据库中。这将导致此时失败,这可能被视为比预期更晚......

© www.soinside.com 2019 - 2024. All rights reserved.