Отношение JPA ко многим к одному Обновление агрегированного столбца в родительском - PullRequest
0 голосов
/ 28 ноября 2018

В приложении Java Spring Rest у меня есть следующие доменные объекты:

@Entity
@Table(name = "order")
public class Order implements Serializable {
    ....
    @OneToMany(mappedBy = "order", orphanRemoval = true)
    private Set<PurchaseOrderItem> purchaseOrderItems = new HashSet<>();

    @NotNull
    @Column(name = "total_net", precision = 10, scale = 2, nullable = false)
    private BigDecimal totalNet;
}

@Entity
@Table(name = "order_item")
public class OrderItem implements Serializable {
    @ManyToOne(optional = false)
    @NotNull
    @JsonIgnoreProperties("")
    @JsonIgnore
    private Order order;

    @NotNull
    @Column(name = "total_net", precision = 10, scale = 2, nullable = false)
    private BigDecimal totalNet;
}

В объекте заказа есть агрегированный столбец, который должен содержать сумму всей totalNet для orderItem, а также при добавлении или удалении orderItem totalNet заказадолжно быть обновлено.

Каков наилучший способ добиться этого?

Текущая реализация осуществляется с помощью таких служб, как

@Service
@Transactional
public class OrderItemService {

  public OrderItemDTO save(OrderItemDTO orderItemDTO) {
    orderItem orderItem = mapper.toEntity(orderItemDTO);

    orderItem = orderItemRepository.save(orderItem);

    if (orderItemDTO.getOrderId() != null) {
        OrderDTO orderResult = orderService.findOne( orderItemDTO.getOrderId()).get();
        orderService.save(orderResult);
        //total is calculated in save method of parent
    }

    return mapper.toDto(orderItem);
  }
}

Это похоже на неправильный поток ... Использование EntityEventListeners с @PostUpdate@PostRemove будет правильно здесь?

...