spring-data-jpa 在单元测试中,Java中的SQL select未从H2数据库返回任何结果

vbopmzt1  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(195)

为什么在将实体保存到数据库后,select SQL查询返回0个结果?
我在测试中使用的是Spring 2.6.2、Hibernate 5和H2 db。
这是我的考验:

@Transactional
@Test
void test_OptimisticLockExceptionOnUpdate() throws SQLException {
  String reportText = "Initial value: " + new Date();
  ReportDTO reportDTO = new ReportDTO();
  reportDTO.setText(reportText);

  // Save a report
  reportDTO = reportService.submit(reportDTO);

  Connection connection = multiTenantConnectionProvider.getAnyConnection();
  String sql = "select * from PUBLIC.report";
  Statement statement = connection.createStatement();
  ResultSet resultSet = statement.executeQuery(sql);

  while (resultSet.next()) {
    String text = resultSet.getString("text");
    System.out.println(text);
  }

我的服务中的方法,该方法保留了表示DTO对象的新实体:

@Transactional
public ReportDTO submit(ReportDTO input) {

  ReportEntity reportEntity = new ReportEntity();
  reportEntity.setText(input.getText());

  reportEntity = reportRepository.save(reportEntity);

  input.setId(reportEntity.getId());
  input.setVersion(reportEntity.getVersion());

  return input;
}
5kgi1eie

5kgi1eie1#

有两种可能的解释:
1.由于您的测试是用@Transactional注解的,所以一切都是在一个事务中运行的。当您要求JPA保存实体时,JPA不会保存实体。相反,它只是跟踪实体,将它们保存到数据库中,这是必要的,通常只在事务结束时进行。它还在执行查询之前刷新对数据库的更改,但前提是这些更改是通过JPA执行的。否则它不会知道他们。
1.您正在使用multiTenantConnectionProvider中的getAnyConnection。这可能是EntityManager使用的同一连接,也可能不是。如果不是,并且您的数据库由于测试在测试结束时回滚事务而禁止脏读,则它将永远看不到EntityManager所做的更改。

相关问题