Spring @Transactional 方法问题
Spring @Transactional method issue
所以,我有一个控制器 [POST]
方法,它基本上应该创建一个 transaction
逻辑很简单,在创建transaction
两个帐户时应该涉及(这是场景),进入transaction
我正在传递3个字段-amount
、emitterId
和 receptorId
。创建交易后,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);
所以,我有一个控制器 [POST]
方法,它基本上应该创建一个 transaction
逻辑很简单,在创建transaction
两个帐户时应该涉及(这是场景),进入transaction
我正在传递3个字段-amount
、emitterId
和 receptorId
。创建交易后,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);