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