Лучше спросить, используя пример, чтобы ...
Сущность PurchaseOrder
имеет список PurchaseOrderDetail
.OneToMany
Отношение.Entity
и list items
не могут быть сохранены напрямую с использованием методов JPA, так как в этом есть некоторые вычисления.Когда мы выполняем обновление на PurchaseOrder
, мы должны сохранить первичный ключ, чтобы мы могли обновляться следующим образом
PurchaseOrder purchaseOrder = purchaseOrderRepository.getOne(purchaseOrderRequest.getId());
purchaseOrder.setSupplier(purchaseOrderRequest.getSupplier());
purchaseOrder.setDollarRate(purchaseOrderRequest.getDollarRate());
purchaseOrder.setShippingCost(purchaseOrderRequest.getShippingCost());
return purchaseOrderRepository.save(purchaseOrder);
Но как Beautifully
обновить List<PurchaseOrderDetail> purchaseOrderDetails
?
Iиметь следующий код, который удалит существующие элементы списка и вставит новые элементы, потеряв первичные ключи.Но что нужно сделать JPA way
, чтобы при обновлении происходило
1. If some items were deleted they should be deleted from DB.
2. If some items were updated they should be updated preserving the primary keys.
3. If some new items are added they should be created having new primary keys.
Код
purchaseOrder.setPurchaseOrderDetails(null);
for (PurchaseOrderDetailRequest purchaseOrderDetailRequest : purchaseOrderRequest.getPurchaseOrderDetails())
{
PurchaseOrderDetail purchaseOrderDetail = new PurchaseOrderDetail();
purchaseOrderDetail.setPartNumber(purchaseOrderDetailRequest.getPartNumber());
purchaseOrderDetail.setDescription(purchaseOrderDetailRequest.getDescription());
purchaseOrderDetail.setQuantity(purchaseOrderDetailRequest.getQuantity());
purchaseOrderDetail.setUnitPriceInDollars(purchaseOrderDetailRequest.getUnitPriceInDollars());
purchaseOrderDetail.setTotalPriceInDollars(purchaseOrderDetailRequest.getQuantity() * purchaseOrderDetailRequest.getUnitPriceInDollars());
purchaseOrderDetail.setUnitPriceInSAR(purchaseOrder.getDollarRate() * purchaseOrderDetailRequest.getUnitPriceInDollars());
purchaseOrderDetail.setTotalPriceInSAR(purchaseOrderDetailRequest.getQuantity() * purchaseOrderDetail.getUnitPriceInSAR());
purchaseOrderDetail.setUnitCost(purchaseOrderDetail.getUnitPriceInSAR() + shippingFactor);
purchaseOrder.addPurchaseOrderDetail(purchaseOrderDetail);
}
PurchaseOrder
@Entity
@Table(name = "purchaseOrders")
public class PurchaseOrder extends UserDateAudit
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 140)
private String supplier;
@NotNull
private Float dollarRate;
@NotNull
private Float amount;
@NotNull
private Float shippingCost;
@OneToMany(
mappedBy = "purchaseOrder",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
@Fetch(FetchMode.SELECT)
@BatchSize(size = 150)
private List<PurchaseOrderDetail> purchaseOrderDetails = new ArrayList<>();
}
PurchaseOrderDetail
@Entity
@Table(name = "purchaseOrderDetails")
public class PurchaseOrderDetail
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
@Size(max = 50)
private String partNumber;
@Size(max = 256)
private String description;
@NotNull
private Integer quantity;
@NotNull
private Float unitPriceInDollars;
@NotNull
private Float totalPriceInDollars;
@NotNull
private Float unitPriceInSAR;
@NotNull
private Float totalPriceInSAR;
@NotNull
private Float unitCost;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "purchaseOrder_id", nullable = false)
private PurchaseOrder purchaseOrder;
}