Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 使用Spring引导启动器数据JPA,唯一约束检查失败太晚_Hibernate_Spring Boot_Spring Data_H2_Unique Constraint - Fatal编程技术网

Hibernate 使用Spring引导启动器数据JPA,唯一约束检查失败太晚

Hibernate 使用Spring引导启动器数据JPA,唯一约束检查失败太晚,hibernate,spring-boot,spring-data,h2,unique-constraint,Hibernate,Spring Boot,Spring Data,H2,Unique Constraint,我对独特的约束特性感到非常惊讶。我正在开发一个带有H2数据库的SpringBoot应用程序,用于单元测试 我的一个实体具有唯一约束。 在类用户的标题下方 @Entity @Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = { "identifier" }) }) @SequenceGenerator(name = "user_pkey", sequenceName = "user_id_seq")

我对独特的约束特性感到非常惊讶。我正在开发一个带有H2数据库的SpringBoot应用程序,用于单元测试

我的一个实体具有唯一约束。 在类用户的标题下方

@Entity
@Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = { "identifier" }) })
@SequenceGenerator(name = "user_pkey", sequenceName = "user_id_seq")
我编写了一个小单元测试来检查惟一约束

测试前功能

我的测试

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

约束完整性在select请求期间检查,而不是在insert期间检查。我不明白结果

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


感谢您的回答:)

唯一约束由数据库维护。如果
插入违反约束,则会导致插入失败。Hibernate将不会向数据库写入实体,直到它必须这样做时,才会调用它。发出搜索查询时,Hibernate的默认行为是在查询之前刷新,以便在查询时可以看到对持久上下文所做的任何更改


因此,您的更改将作为执行查询的副作用插入到数据库中。这将导致此时出现故障,这可能会被视为比预期的时间晚…

唯一约束由数据库维护。如果
插入违反约束,则会导致插入失败。Hibernate将不会向数据库写入实体,直到它必须这样做时,才会调用它。发出搜索查询时,Hibernate的默认行为是在查询之前刷新,以便在查询时可以看到对持久上下文所做的任何更改


因此,您的更改将作为执行查询的副作用插入到数据库中。这将导致此时的故障,可能会被认为比预期的要晚…

不客气!很高兴使用hibernate进行编码,这是一个了不起的框架!Soory,我知道这个问题很老,但我遇到了完全相同的问题,我想知道如果数据库中已经存在数据,有什么解决方案可以防止hibernate持久化数据。我们应该在什么时候进行手动检查,或者定制验证器?@AlainDuguine这取决于很多事情。。。创建一个包含用例和代码更多细节的新问题!谢谢我通过在我的服务层中创建repository.flush()找到了答案。不客气!很高兴使用hibernate进行编码,这是一个了不起的框架!Soory,我知道这个问题很老,但我遇到了完全相同的问题,我想知道如果数据库中已经存在数据,有什么解决方案可以防止hibernate持久化数据。我们应该在什么时候进行手动检查,或者定制验证器?@AlainDuguine这取决于很多事情。。。创建一个包含用例和代码更多细节的新问题!谢谢我通过在服务层中创建repository.flush()找到了答案。
@Before
public void before() {
        User user1 = new User();
        user1.setBlackListed(false);
        user1.setIdentifier("test@tby.com");
        user1.setRefreshToken("azerty");          
        this.userDao.save(user1);
}
@Test(expected = DataIntegrityViolationException.class)
public void user_identifierUnicityTest() {
    User user4 = new User();
    user4.setBlackListed(false);
    user4.setIdentifier("test@tby.com");
    user4.setRefreshToken("azerty4");
    User response = this.userDao.save(user4);
    this.userDao.findByIdentifier("test@tby.com");
}