JPA: не удается найти объект после сохранения в БД

#java #spring #spring-boot #hibernate #jpa

#java #весна #весенняя загрузка #спящий режим #jpa

Вопрос:

Я написал функцию в приложении Spring boot следующим образом:

 @Component
public class AspectHelper {

private final MyRepository myRepository;

public AspectHelper(
      MyRepository myRepository) {
   this.myRepository = myRepository;
}

@Async
public void save(MyEntity entity) {
  try {
    myRepository.save(entity);
    Optional<MyEntity> savedEntityOpt = myRepository.findById(entity.id);
    ...
  } catch (Exception e) {
    log.error("Error occurred while saving", e);
  }
}

}
  

Вышеупомянутая функция вызывается из другого компонента в потоке, которого нет ни в одной транзакции.

Проблема в том, что я могу получить действительный идентификатор объекта сразу после сохранения объекта в БД, пока я пытаюсь получить то же самое, я получаю точную сохраненную сущность.

Но при проверке БД я не могу найти объект.

Я понятия не имею, почему это происходит. Может кто-нибудь, пожалуйста, помочь здесь?

Комментарии:

1. Вам необходимо сохранить в транзакции. Во-вторых, вы можете использовать saveAndFlush метод репозитория.

2. save против saveAndFlush объяснения baeldung.com/spring-data-jpa-save-saveandflush

3. Когда вы сохраняете объект, есть ли у него идентификатор? Кстати. эта вещь с транзакцией и saveAndFlush неверна

4. @Andronicus Сразу после сохранения объекта я могу получить связанный идентификатор, с которым я выполняю запрос поиска в следующей строке.

5. Вы уверены, что не в транзакции, обычно не в транзакции, в которой сохраняется объект после метода сохранения

Ответ №1:

Бьюсь об заклад, вы используете уровень изоляции REPEATABLE_READ, который используется по умолчанию для MySQL. В этом случае вы должны понимать, что соединение будет видеть только данные, которые были зафиксированы до момента, когда вы начали транзакцию. Попробуйте использовать автоматическую фиксацию в вашем редакторе SQL и / или переключитесь на READ_COMMITTED