Spring Boot Starter Data JPA 的唯一约束检查失败太晚
Unique constraint check fails too late with Spring Boot Starter Data JPA
我对独特的约束功能感到非常惊讶。我正在使用 H2 数据库开发一个 spring 启动应用程序以进行单元测试。
我的一个实体有唯一约束。
在 class 用户的 headers 下方。
@Entity
@Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = { "identifier" }) })
@SequenceGenerator(name = "user_pkey", sequenceName = "user_id_seq")
我写了一个小的单元测试来检查唯一约束。
Before test function
@Before
public void before() {
User user1 = new User();
user1.setBlackListed(false);
user1.setIdentifier("test@tby.com");
user1.setRefreshToken("azerty");
this.userDao.save(user1);
}
My test
@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");
}
我很惊讶,我以为在保存请求期间会抛出异常。或者查找请求时抛出异常
在 select 请求期间检查约束完整性,而不是插入。我不明白结果。
这是唯一约束的正常行为吗?
感谢您的回答:)
唯一约束由数据库维护。如果 insert
违反约束,这将导致失败。 Hibernate 不会将实体写入数据库,除非它必须这样做,当这种情况发生时,它被称为 flushing。当您发出搜索查询时,Hibernate 的默认行为是在查询之前刷新,以便在查询时可以看到对持久上下文所做的任何更改。
因此,您的更改作为执行查询的副作用被插入到数据库中。这将导致此时失败,这可能被认为比预期的要晚...
我对独特的约束功能感到非常惊讶。我正在使用 H2 数据库开发一个 spring 启动应用程序以进行单元测试。
我的一个实体有唯一约束。 在 class 用户的 headers 下方。
@Entity
@Table(name = "user", uniqueConstraints = { @UniqueConstraint(columnNames = { "identifier" }) })
@SequenceGenerator(name = "user_pkey", sequenceName = "user_id_seq")
我写了一个小的单元测试来检查唯一约束。
Before test function
@Before
public void before() {
User user1 = new User();
user1.setBlackListed(false);
user1.setIdentifier("test@tby.com");
user1.setRefreshToken("azerty");
this.userDao.save(user1);
}
My test
@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");
}
我很惊讶,我以为在保存请求期间会抛出异常。或者查找请求时抛出异常
在 select 请求期间检查约束完整性,而不是插入。我不明白结果。
这是唯一约束的正常行为吗?
感谢您的回答:)
唯一约束由数据库维护。如果 insert
违反约束,这将导致失败。 Hibernate 不会将实体写入数据库,除非它必须这样做,当这种情况发生时,它被称为 flushing。当您发出搜索查询时,Hibernate 的默认行为是在查询之前刷新,以便在查询时可以看到对持久上下文所做的任何更改。
因此,您的更改作为执行查询的副作用被插入到数据库中。这将导致此时失败,这可能被认为比预期的要晚...