#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-saveandflush3. Когда вы сохраняете объект, есть ли у него идентификатор? Кстати. эта вещь с транзакцией и
saveAndFlush
неверна4. @Andronicus Сразу после сохранения объекта я могу получить связанный идентификатор, с которым я выполняю запрос поиска в следующей строке.
5. Вы уверены, что не в транзакции, обычно не в транзакции, в которой сохраняется объект после метода сохранения
Ответ №1:
Бьюсь об заклад, вы используете уровень изоляции REPEATABLE_READ, который используется по умолчанию для MySQL. В этом случае вы должны понимать, что соединение будет видеть только данные, которые были зафиксированы до момента, когда вы начали транзакцию. Попробуйте использовать автоматическую фиксацию в вашем редакторе SQL и / или переключитесь на READ_COMMITTED