gpt4 book ai didi

java - Spring @Transactional 方法问题

转载 作者:行者123 更新时间:2023-12-01 19:35:38 27 4
gpt4 key购买 nike

所以,我有一个 Controller [POST]方法,它基本上应该创建一个事务

逻辑很简单,在创建交易时应涉及两个帐户(这是场景),在交易中我传递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;
}

}

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

提前谢谢您!

最佳答案

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

关于java - Spring @Transactional 方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com