如何为自动生成的 id 做 findById

问题描述

我有一个场景,我正在使用一个事件并将详细信息保存在数据库中。现在,存储在数据库中的记录具有自动生成的 id 字段 @GeneratedValue(strategy = GenerationType.IDENTITY)

在我的测试用例中,我需要检查数据是否存储在数据库中并且是否符合预期。 但我不确定我将如何处理 SpringBoot Crud/JPA 存储库的 findById(),因为我不知道生成了什么值。

任何帮助将不胜感激。

解决方法

我认为您正在寻找注释 @DirtiesContext .

它是一个 Test annotation,表示与测试关联的 ApplicationContext 是脏的,因此应该关闭并从上下文缓存中删除。 - {{3} }

阅读第 9.3.4 节 - javadoc

检查 - Here 如下:

@Test
@DirtiesContext
public void save_basic() {
    // get a course
    Course course = courseJpaRepository.findById(10001L);
    assertEquals("JPA ",course.getName());

    // update details
    course.setName("JPA - Updated");
    courseJpaRepository.saveOrUpdate(course);

    // check the value
    Course course1 = courseJpaRepository.findById(10001L);
    assertEquals("JPA - Updated",course1.getName());
}

顺便说一句 - 如何获取 id :只需通过 save 的返回类型的 getter 方法

EmployeeDetails employeeDetails = emaployeeService.saveEmployeeDetails(employee);
int temp = employeeDetails.getID()

相关帖子:Example

,

看看 CrudRepository 接口中的 save 方法。 Spring 在 transaction 中执行此方法,完成后 Hibernate 将在返回的实体中生成标识符。

假设您的实体和存储库如下所示:

....
public class SomeEntity {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    public SomeEntity(String name){
        this.name = name;
    }
....
}

public interface SomeRepository extends CrudRepository<SomeEntity,Long> {
}

保存实体后:

    SomeEntity someEntity = someRepository.save(new SomeEntity("Some entity"));

someEntity.getId() 将包含可在您的测试中进一步使用的实际记录 ID。