У меня есть такой вот метод:
@Transactional
public void withdrawMoney(Withdrawal withdrawal) {
// Если пользователь пытается снять отрицальную или нулевую сумму
// -----------------------------------------------------------------------------------
if (withdrawal.getValue() >= 0) {
throw new RuntimeException("Wrong withdrawal value!");
}
// -----------------------------------------------------------------------------------
// Создаем ссылки на персистентные объекты
// -----------------------------------------------------------------------------------
Account account;
Currency currency;
// -----------------------------------------------------------------------------------
// К нам приходит не персистентный объект, поэтому вытаскиваем нужные объекты из базы
// -----------------------------------------------------------------------------------
try {
account = accountRepository.findOne(withdrawal.getAccount().getUuid());
} catch (Exception e) {
throw new RuntimeException("Wrong account uuid");
}
try {
currency = currencyRepository.findOne(withdrawal.getCurrency().getId());
} catch (Exception e) {
throw new RuntimeException("Wrong currency id");
}
// -----------------------------------------------------------------------------------
// Если валюта на счете и валюта снятия не совпадают, то выкидываем исключение
// -----------------------------------------------------------------------------------
if (!account.getCurrency().equals(currency.getName())) {
throw new RuntimeException("Wrong currency!");
}
// -----------------------------------------------------------------------------------
// Вычитаем нужную сумму и сохраняем изменения в объекте
// -----------------------------------------------------------------------------------
account.setValue(account.getValue() - withdrawal.getValue());
accountRepository.save(account);
// -----------------------------------------------------------------------------------
// Кладем персистентные объекты в withdrawal
// -----------------------------------------------------------------------------------
withdrawal.setAccount(account);
withdrawal.setCurrency(currency);
// -----------------------------------------------------------------------------------
// Сохраняем операцию снятия денег в базе
// -----------------------------------------------------------------------------------
withdrawalRepository.save(withdrawal);
// -----------------------------------------------------------------------------------
}
И две проблемы с ним. Первое, мне кажется, что я сильно перемудрил и все можно сделать гораздо проще. И второе - он не работает. Говорит, что все ок, но операция не выполняется. Как правильно воспользоваться аннтация Transactional
в данном случае ?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок