Spring @Transactional 方法问题

Spring @Transactional method issue

所以,我有一个控制器 [POST] 方法,它基本上应该创建一个 transaction

逻辑很简单,在创建transaction 两个帐户时应该涉及(这是场景),进入transaction我正在传递3个字段-amountemitterIdreceptorId。创建交易后,senderBalance 应减少transaction.amount,receiverBalance 应增加transaction.amount,但由于某种原因没有任何变化

代码如下:

@Autowired
    private AccountRepository accountRepository;

    @Autowired
    private TransactionRepository transactionRepository;

@Transactional
    @PostMapping("/transactions")
    public ResponseEntity<Transaction> createTransaction(@Valid @RequestBody Transaction transaction) {
        final Transaction result = transactionRepository.save(transaction);
        final URI location = ServletUriComponentsBuilder.fromCurrentRequest().
                path("/{id}")
                .buildAndExpand(result.getId()).toUri();
        Integer emitterBalance = accountRepository.findById(result.getSenderAccountId()).get().getBalance();
        Integer receptorBalance = accountRepository.findById(result.getReceiverAccountId()).get().getBalance();
        Integer amount = transactionRepository.findById(result.getId()).get().getAmount();
        Integer emitterFinalBalance = emitterBalance - amount;
        Integer receptorFinalBalance = receptorBalance + amount;
        accountRepository.findById(result.getSenderAccountId()).get().setBalance(emitterFinalBalance);
        accountRepository.findById(result.getReceiverAccountId()).get().setBalance(receptorFinalBalance);
        transactionRepository.save(result);
        transactionRepository.save(transaction);
        return ResponseEntity.created(location).build();
    }

实体 交易

public class Transaction {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private Integer amount;
    private Instant created;
    private Long senderAccountId;
    private Long receiverAccountId;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "emitterId")
    private Account emitterId;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "receptorId")
    private Account receptorId;

    public Transaction(Integer amount, Account emitterId, Account receptorId){
        this.created = Instant.now();
        this.amount = amount;
        this.emitterId = emitterId;
        this.receptorId = receptorId;
        senderAccountId = this.emitterId.getId();
        receiverAccountId = this.receptorId.getId();
    }

}

账户

public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String holder;

    @NotNull
    private Integer balance;

    @OneToMany(mappedBy = "emitterId",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<Transaction> transactionsMade;

    @OneToMany(mappedBy = "receptorId",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    private List<Transaction> transactionsReceived;

    public Account(String holder, Integer balance){
        this.holder = holder;
        this.balance = balance;
    }

    public Account(Long id){
        this.id = id;
    }

}

你能帮我解决这个问题吗:)?

提前谢谢你!

您似乎没有保留更新余额的帐户对象。您是否具有从交易到个人帐户的实体映射以及级联,以便一旦交易被保存,相应的帐户对象也会被保留。

尝试以下操作:

    accountRepository.findById(result.getSenderAccountId()).get().setBalance(emitterFinalBalance);

accountRepository.findById(result.getReceiverAccountId()).get().setBalance(receptorFinalBalance);

替换为

Account sender = accountRepository.findById(result.getSenderAccountId()).get();
sender.setBalance(emitterFinalBalance);
accountRepository.save(sender);

Account receiver = accountRepository.findById(result.getReceiverAccountId()).get();
receiver.setBalance(receptorFinalBalance);
accountRepository.save(receiver);