如何使一个 JPA 存储库成为事务性的而另一个不是?

How to make one JPA repository Transactional but another not?

我有尝试更改某些实体的方法,同样在这个方法中我想保存交易信息。 当发生任何异常时,我想回滚保存实体但仍想保存事务。 那么如何为实体事务创建一个存储库而不为事务创建一个存储库?

存储库中有代码

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

但这并没有帮助。 将交易保存在最后一个区块中。

更新

我用AOP解决了。我在方面建议中创建事务对象并将其保存在此处,超出 JPA 事务。

在新的@Transactional

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

这将保存您的 transaction 元素,即使另一个 @Transactional 被回滚

我用AOP解决了。我在方面建议中创建事务对象并将其保存在 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 的顺序,这样此建议将超过交易。 在方面 class 上设置 @Order(100)。 默认情况下,它的订单较小,因此处于交易状态。