java - Spring boot 在单元测试中删除实体会导致 StaleStateException : Batch update returned unexpected row count from update

标签 java spring-boot spring-data-jpa dbunit

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

@Entity
@Table(name = "my_table")
public class MyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;

    @Getter
    @Type(type="uuid-char")
    @Column(name = "attribute_id", unique = true, nullable = false)
    protected UUID attributeId;

    @Version
    protected Date version;

    @Getter
    @Column(unique = true, nullable = false)
    protected String value;

}

该实体有一个简单的存储库:

public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, Long> {

    Optional<MyEntity> findByMyId(UUID id);

}

单元测试使用内存数据库:

spring:
  jpa:
    database: H2
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create
    properties:
      hibernate.cache.use_second_level_cache: false
      hibernate.cache.use_query_cache: false
    generate-ddl: true
  datasource:
    url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false
    username: sa
    password: sa
    driver-class-name: org.h2.Driver

测试本身(使用 database-rider ):

@Test
@DataSet(value = INITIAL, transactional = true)
void delete() {
    Optional<MyEntity> v = repository.findByMyId(SECOND.getAttributeId());
    assertThat(v.isPresent()).isTrue();
    repository.delete(v.get());
    v = repository.findByMyId(SECOND.getAttributeId());
}

测试中的最后一行抛出以下异常:

Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:67)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:54)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3480)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3737)
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:99)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)

所有其他保存和查找测试都按预期工作,仅使用删除 正在造成这种情况。

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

最佳答案

您是否尝试过使用 @ExpectedDataSet ?通过这种方式,您可以让 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
}

关于java - Spring boot 在单元测试中删除实体会导致 StaleStateException : Batch update returned unexpected row count from update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56218519/

相关文章:

java - 按每个子列表中的第一个数字排序 List<List<Integer>>

java - 线程 "main"中的异常 org.springframework.jdbc.CannotGetJdbcConnectionException

spring-boot - JWToken 无效 : kid is a required JOSE Header

java - Spring Boot2 Oauth2 隐式流程 - http ://localhost:8080/oauth/authorize getting Access Denied

java - 如何加速Java中的数组交集?

java - 带有 header 列表的 REST 调用

java - 在 Play 框架应用程序 conf 文件中定义键

spring data jpa规范join fetch不起作用

java - JPA Spring 忽略 @Transacational 内的延迟加载

java - Spock - 模拟存储库方法 save() 给出 NullPointerException