【问题标题】:How to do findById for autogenerated id如何为自动生成的 ID 执行 findById
【发布时间】:2021-06-08 15:28:30
【问题描述】:

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 您可以从保存的详细信息中获取Id
  • 这是个问题吧?我如何获得该 ID
  • Details d = repository.save(new Details()); Details fromDb = repository.findById(d.getId())

标签: spring-boot crud-repository


【解决方案1】:

看看来自 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,可在您的测试中进一步使用。

【讨论】:

    【解决方案2】:

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

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

    阅读第 9.3.4 节 - Here

    检查 - Example 以及以下:

    @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()
    

    相关帖子:Here

    【讨论】:

    • 谢谢,但老实说,我不明白它将如何解决我的问题。如果我添加注释,findById() 中的id 的值应该是多少。希望我说得通。
    • @newLearner 您可以使用一些 DUMMY ID 创建数据,然后在数据库中查询此 DUMMY ID。它将如何提供帮助 - 一旦完成测试,您使用此 DUMMY id 创建的数据将从数据库中删除。这样,您可以测试数据是否存储在 DB 中。
    • 好的。所以你的建议是我自己在数据库中创建一个预期数据的条目,然后基于它进行查询。对吧?
    • 是的...但是您也可以使用方法存储库,它可以为您保存数据。
    • @newLearner:用我很久以前试过的一个例子更新了答案。这基本上是为了测试数据库中的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2011-06-03
    • 1970-01-01
    • 2021-11-08
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多