JPA: Почему объект save() не работает внутри блока catch, несмотря на @Transactional?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JPA: Почему объект save() не работает внутри блока catch, несмотря на @Transactional?

Сообщение Anonymous »

В настоящее время я работаю с JPA. Я столкнулся с проблемой во время разработки. Вот текущая ситуация:

Код: Выделить всё

itemService addItem: If the item is already owned, an exception is thrown. If the item is owned but the user is in the process of waiting for a specified time to own it, another exception is thrown. If the item is not owned, the item is successfully given to the user.

Код: Выделить всё

StoreService handleItem: This method gives the item to the user, and if the item is already owned but the user is waiting for a specified time to own it, it should be processed as an immediate gift.
Я хочу и дальше использовать метод addItem класса itemService, поскольку он используется всей моей командой разработчиков, а не только мной.
Ниже приведена часть кода StoreService:

Код: Выделить всё

@Transactional
protected void handleItem(User user, AssetItem assetItem) throws CustomCheckedException {
try {
itemService.addItem(user, assetItem);
} catch (CustomCheckedException e) {
if (e.getErrorCode() == ErrorCode.RECEIVING_IN_PROGRESS) {
Item item = (Item) e.getAdditionalData();
item.setStatusToOwned();
itemRepository.save(item);
itemRepository.flush();
} else {
throw e;
}
}
}
Причина обработки CustomCheckedException отдельно заключается в том, что ранее я столкнулся с ошибкой UnexpectedRollbackException: транзакция автоматически откатилась, поскольку она была помечена как предназначенная только для отката. Поскольку было указано, что CheckedException не вызовет откат, я применил этот подход.
Мои вопросы следующие:
  • < li>В блоке catch itemRepository.save(item) не работает должным образом, и изменения не отражаются в базе данных, даже если используется @Transactional. Почему метод сохранения не работает в блоке catch?
  • Чтобы решить проблему с UnexpectedRollbackException: транзакция автоматически откатилась, поскольку она была отмечена только для отката я ввел CustomCheckedException (поскольку CheckedExceptions не вызывает откат) вместе с блоком try-catch. Есть ли лучший способ справиться с этим без использования этих механизмов?
Что я пробовал:
  • Я реализовал аннотацию @Transactional для метода, который обрабатывает назначение элемента (handleItem в StoreService).
  • Я попытался сохранить объект (itemRepository.save(subCharacter)) внутри блока catch, где я обрабатывать пользовательское исключение (CustomCheckedException).
  • Я использовал флеш(), чтобы вручную принудительно синхронизировать контекст персистентности с базой данных.
  • Я также протестировал без флеш() и заметил, что база данных не обновлялась, пока я явно не вызвал флеш().
Что я ожидал:
  • Я ожидал, что аннотация @Transactional автоматически зафиксирует изменения в базе данных при метод save() вызывается внутри блока catch, даже если генерируется исключение.
  • Я ожидал, что изменения сохранятся без необходимости вручную очищать менеджер сущностей.
  • Я также ожидал, что изменения будут зафиксированы и отражены в базе данных без необходимости дополнительного вызова flash().


Подробнее здесь: https://stackoverflow.com/questions/792 ... nsactional
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»