如何使一个 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)。
默认情况下,它的订单较小,因此处于交易状态。
我有尝试更改某些实体的方法,同样在这个方法中我想保存交易信息。 当发生任何异常时,我想回滚保存实体但仍想保存事务。 那么如何为实体事务创建一个存储库而不为事务创建一个存储库?
存储库中有代码
@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)。 默认情况下,它的订单较小,因此处于交易状态。