有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使一个JPA存储库具有事务性而另一个不具有事务性?

我有一个方法,我试图改变一些实体,在这个方法中我想保存事务信息。 当发生任何异常时,我希望回滚保存实体,但仍希望保存事务。 那么,如何为实体事务创建一个存储库,而为事务创建一个存储库呢

没有来自存储库的代码

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

但这没用。 保存放置在最终块中的事务

更新

我用AOP解决了这个问题。我在aspect advice中创建了事务对象,并将其保存在这里,不使用JPA事务


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    用一个新的@Transactional

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

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