Java Spring boot在单元测试中删除实体会导致StaleStateException:批处理更新从更新中返回意外的行数

Java Spring boot在单元测试中删除实体会导致StaleStateException:批处理更新从更新中返回意外的行数,java,spring-boot,spring-data-jpa,dbunit,Java,Spring Boot,Spring Data Jpa,Dbunit,我正在使用SpringBoot(2.1.4)并尝试编写一个简单的单元测试来删除 实体。实体(为简洁起见省略了某些部分): @实体 @表(name=“my_表”) 公共类MyEntity{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 保护长id; @吸气剂 @类型(Type=“uuid char”) @列(name=“attribute\u id”,unique=true,nullable=false) 受保护的UUID属性ID; @版本 受保

我正在使用SpringBoot(2.1.4)并尝试编写一个简单的单元测试来删除 实体。实体(为简洁起见省略了某些部分):

@实体
@表(name=“my_表”)
公共类MyEntity{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
保护长id;
@吸气剂
@类型(Type=“uuid char”)
@列(name=“attribute\u id”,unique=true,nullable=false)
受保护的UUID属性ID;
@版本
受保护日期版本;
@吸气剂
@列(unique=true,nullable=false)
保护字符串值;
}
该实体有一个简单的存储库:

公共接口MyEntityRepository扩展了分页和排序存储库{
可选的findByMyId(UUID id);
}
单元测试使用内存中的数据库:

spring:
jpa:
数据库:H2
数据库平台:org.hibernate.dial.h2dial
冬眠:
ddl自动:创建
特性:
hibernate.cache.use_第二级_缓存:false
hibernate.cache.use\u query\u cache:false
生成ddl:true
数据源:
url:jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;数据库\u到\u上限=false
用户名:sa
密码:sa
驱动程序类名:org.h2.driver
测试本身(使用):

@测试
@数据集(值=初始值,事务性=真)
作废删除(){
可选v=repository.findByMyId(SECOND.getAttributeId());
断言(v.isPresent()).isTrue();
delete(v.get());
v=repository.findByMyId(SECOND.getAttributeId());
}
测试中的最后一行引发以下异常:

原因:org.hibernate.StaleStateException:批更新从更新[0]返回意外的行计数;实际行数:0;预期:1
在org.hibernate.jdbc.expections$basicExpection.checkBatched上(expections.java:67)
在org.hibernate.jdbc.expections$basicexpection.verifyOutcome(expections.java:54)上
位于org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46)
位于org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3480)
位于org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3737)
位于org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:99)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
“保存”和“查找”的所有其他测试均按预期工作,仅使用“删除” 是什么原因造成的


我从其他帖子中尝试了几种建议的解决方案(是一篇类似的帖子,但没有解决我的问题)

您正在尝试访问
v=repository.findByMyId(SECOND.getAttributeId())在执行尚未提交的删除操作后。

是否尝试使用?通过这种方式,您可以让dbrider在测试执行后断言数据库的状态:

@Test
@DataSet(value = INITIAL, transactional = true)
@ExpectedDataSet("expected.yml")
void delete() {
    Optional<MyEntity> v = repository.findByMyId(SECOND.getAttributeId());
    assertThat(v.isPresent()).isTrue();
    repository.delete(v.get());
    //v = repository.findByMyId(SECOND.getAttributeId()); let dbrider assert that for you
}
@测试
@数据集(值=初始值,事务性=真)
@ExpectedDataSet(“expected.yml”)
作废删除(){
可选v=repository.findByMyId(SECOND.getAttributeId());
断言(v.isPresent()).isTrue();
delete(v.get());
//v=repository.findByMyId(SECOND.getAttributeId());让dbrider为您断言这一点
}

如何在测试中断言之前提交它?以前在删除中没有遇到过这种行为,不知道有什么不同。