Выбор SQL в Java не возвращает никаких результатов из базы данных H2 в модульном тесте

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

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

Markus 18.10.2022 06:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два возможных объяснения:

  1. Поскольку ваш тест помечен @Transactional, все выполняется в одной транзакции. JPA не сохраняет ваши объекты, когда вы просите его сделать это. Вместо этого он просто отслеживает их, чтобы сохранить в базу данных, когда это необходимо, что часто происходит только в конце транзакции. Он также сбрасывает изменения в базу данных перед выполнением запросов, но только если они выполняются через JPA, иначе он бы о них не узнал.
  2. Вы используете getAnyConnection из multiTenantConnectionProvider. Это может быть или не быть тем же соединением, которое используется EntityManager. Если это не так, он никогда не увидит изменений EntityManager, если ваша база данных предотвращает грязное чтение, потому что тест откатывает транзакции в конце теста.

Другие вопросы по теме