Код: Выделить всё
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.Ниже приведена часть кода 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;
}
}
}
Мои вопросы следующие:
- < 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
Мобильная версия