Почему после сохранения объекта в БД SQL-запрос select возвращает 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;
}




Есть два возможных объяснения:
@Transactional, все выполняется в одной транзакции.
JPA не сохраняет ваши объекты, когда вы просите его сделать это.
Вместо этого он просто отслеживает их, чтобы сохранить в базу данных, когда это необходимо, что часто происходит только в конце транзакции.
Он также сбрасывает изменения в базу данных перед выполнением запросов, но только если они выполняются через JPA, иначе он бы о них не узнал.getAnyConnection из multiTenantConnectionProvider. Это может быть или не быть тем же соединением, которое используется EntityManager.
Если это не так, он никогда не увидит изменений EntityManager, если ваша база данных предотвращает грязное чтение, потому что тест откатывает транзакции в конце теста.
Я не вижу никаких очевидных проблем в вашем коде, но есть ли причина, по которой вы используете подготовленные операторы вместо самого репозитория JPA?
reportRepositoryуже должен предлагать кучу методов по умолчанию, если вы позволите ему расширитьCrudRepository, например.findAll(): docs.spring.io/spring-data/commons/docs/current/api/org/… Возможно, есть проблема междуreportRepositoryи тем не менееmultiTenantConnectionProviderработает в отношении транзакций, которые вы используете.