在我们的Spring应用程序中,我们使用一组通用存储库测试来验证使用Spring存储库的最基本用例.其中一个测试验证,如果您try 获取以前删除的实体,则会抛出EntityNotFoundException.
在我们迁移到Spring Boot3和Hibernate6之前,这些测试工作正常,但在更新之后,预期的异常不再被抛出.
您可以使用以下设置重现此行为:
- Java(一个简单的实体)
package de.test.hibernate_delete.repository;
import jakarta.persistence.*;
@jakarta.persistence.Entity
@Table(name = "entity")
public class Entity {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) Long id;
@Version long version;
@Column(name = "data") String data;
public Entity(String data) {this.data = data;}
public Entity() {}
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public long getVersion() {return version;}
public void setVersion(long version) {this.version = version;}
public String getData() {return data;}
public void setData(String data) {this.data = data;}
}
- EntiryRepository.java(简单JpaRepository)
package de.test.hibernate_delete.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EntityRepository extends JpaRepository<Entity, Long> {
}
- Java(导致错误的测试用例)
package de.test.hibernate_delete;
import de.test.hibernate_delete.repository.Entity;
import de.test.hibernate_delete.repository.EntityRepository;
import jakarta.persistence.EntityNotFoundException;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = HibernateDeleteApplication.class)
public class EntityDeleteTest {
@Autowired private EntityRepository repository;
@Test public void testDelete() {
Entity storedSample = repository.saveAndFlush(new Entity("data"));
assertNotNull(storedSample.getId());
repository.delete(storedSample);
repository.flush();
assertThrows(EntityNotFoundException.class, () -> assertNull(repository.getOne(storedSample.getId())));
}
}
测试结果为以下失败消息:
org.opentest4j.AssertionFailedError: Unexpected exception type thrown,
Expected :class jakarta.persistence.EntityNotFoundException
Actual :class org.opentest4j.AssertionFailedError
我还将我的最小示例推送到了GitHub回购:https://github.com/LorenzSLA/hibernate_delete_minimal_exampel 失败的测试可以在GitHub Actions Build:https://github.com/LorenzSLA/hibernate_delete_minimal_exampel/actions/runs/6094606983/job/16536481715中看到
Has anyone had similar problems after migrating to Spring Boot 3?个
最新情况:
感谢Andreys comment,我更改了测试用例:
@Test
public void testDelete() {
T storedSample = getRepository().saveAndFlush(getSample());
assertNotNull(storedSample.getId());
getRepository().delete(storedSample);
getRepository().flush();
assertFalse(getRepository().existsById(storedSample.getId()));
}