- 주문 서비스 중에 주문을 완료하고 받은 포인트를 사장 계정에 넣는 API를 구현
- @Transactional을 걸어놨으니 주문은 주문대로 계정은 계정대로 알아서 Dirty checking할 것이라고 생각했으나..
@Transactional
public void completeOrders(Account owner, Long accountId) {
List<Order> orders = orderRepository.findAllByAccountId(accountId);
int totalPrice = 0;
for (Order order : orders) {
checkOrderStatus(order).complete();
totalPrice += order.getMenu().getPrice() * order.getQuantity();
}
owner.earnPoint(totalPrice);
}
- 사장은 돈(포인트)를 받지 못하였다..
- 다시 가만히 보니 사장은 아직 영속화되지 않은 상태였다.
- 부랴부랴 영속화를 시켜주고 해결
@Transactional
public void completeOrders(Account owner, Long accountId) {
List<Order> orders = orderRepository.findAllByAccountId(accountId);
int totalPrice = 0;
for (Order order : orders) {
checkOrderStatus(order).complete();
totalPrice += order.getMenu().getPrice() * order.getQuantity();
}
owner.earnPoint(totalPrice);
accountRepository.save(owner); // 일단 불러줘야 Dirty한지 알 것 아닌가!
}