2016-05-13 3 views
0

У меня есть метод, где я пытаюсь изменить какой-либо объект, также в этом методе я хочу сохранить информацию о транзакции. Когда возникло какое-либо исключение, я хочу отменить сохранение объекта, но все же хочу сохранить транзакцию. Итак, как сделать один репозиторий для транзакции сущностей, но репозиторий для транзакций нет?Как сделать один репозиторий JPA Transactional, а другой нет?

Там код из репозитория

@Override 
@Transactional(noRollbackFor=NotEnoughAmountInAccountException.class) 
<T extends Transaction> T save(T transaction); 

, но это не помогает. Сохранение транзакции, размещенной в финальном блоке.

ОБНОВЛЕНИЕ

Я решил его с помощью АОП. Я создаю объект Transaction в совете по аспектам и сохраняю его здесь, из транзакции JPA.

+0

Пожалуйста, задайте вопрос, покажите нам исключения след ... –

+0

Я добавил вопрос. Нет трассировки стека, только транзакция также не сохраняется из-за откат. – VDanyliuk

+0

Что вы можете сделать, так это оставить классы репозитория так, как они есть, и иметь методы обслуживания с различными транзакционными поведением, чтобы при вызове вашего метода он вызывал другие методы обслуживания с различным транзакционным поведением (например, Propagation.REQUIRES_NEW). Таким образом, вы можете сохранить «транзакцию», а в случае любого неконтролируемого исключения или с внешней транзакцией «NotEnoughAmountInAccountException» может быть отменена внешняя транзакция, но внутренняя транзакция с новым поведением все равно будет выполнена. – Bunti

ответ

0

я решил его с помощью АОП. Я создаю объект Transaction в совете по аспектам и сохраняю его здесь, из транзакции JPA.

Это @Transactional методы

@SaveTransaction 
@Transactional 
public synchronized Transaction move(@NonNull String accountName, @NonNull String destinationName, @NonNull BigDecimal amount, String comment) { 
    checkAmountIsPositive(amount); 

    Account donor = getAccount(accountName); 
    Account acceptor = getAccount(destinationName); 

    if (!isEnoughAmount(accountName, amount)) throw new NotEnoughAmountInAccountException(); 

    BigDecimal newDonorAmount = donor.getAmount().add(amount.negate()); 
    BigDecimal newAcceptorAmount = acceptor.getAmount().add(amount); 

    donor.setAmount(newDonorAmount); 
    acceptor.setAmount(newAcceptorAmount); 

    accountRepository.save(donor); 
    accountRepository.save(acceptor); 

    return null; 
} 

И это аспект советы

@Around("@annotation(com.softjourn.coin.server.aop.annotations.SaveTransaction)") 
public Transaction saveTransaction(ProceedingJoinPoint joinPoint) throws Throwable { 
    Transaction transaction = prepareTransaction(joinPoint); 
    try { 
     joinPoint.proceed(); 
     transaction.setStatus(TransactionStatus.SUCCESS); 
     return transaction; 
    } catch (Throwable e) { 
     transaction.setStatus(TransactionStatus.FAILED); 
     transaction.setError(e.getLocalizedMessage()); 
     throw e; 
    } finally { 
     transactionRepository.save(transaction); 
    } 
} 

Кроме того, важно, чтобы сделать заказ этого совета выше, чем порядок @Transactional так что этот совет будет над сделкой. Установите @Order (100) на класс аспект. По умолчанию заказ меньше, поэтому он находится под транзакцией.

0

ли в новом @Transactional

@Transactional(propagation=Propagation.REQUIRES_NEW) 
<T extends Transaction> T save(T transaction); 

Это сэкономит ваше transaction элемент, даже если другой @Transactional откатывается

+1

Я пробовал это, но это не работает для меня. – VDanyliuk

+0

Возможно, это связано с тем, что вы переопределяете «save» по умолчанию из spring-data, что является «@ Transactional» ... попробуйте сделать это в пользовательском методе, например, как метод с именем «saveTransaction (транзакция T)». (он должен работать (конечно, вам придется реализовать этот настраиваемый метод) – Pras

+0

Он также не работает. Как я понимаю, Spring создает прокси-методы только для общедоступных методов, поэтому @Transactional по частному методу не работает. Я не хочу публиковать его, потому что кто-то может назвать его без сохранения транзакции. – VDanyliuk

Смежные вопросы