При обновлении я мог бы сначала удалить все существующие строки заказа и воссоздать их, но не уверен, что это плохая практика?
обновление только тех строк заказа, которые нуждаются в обновлении, Лучшая практика.
Я мог бы сначала удалить все существующие строки заказа и воссоздать их
Это может привести к выполнению большого количества запросов на удаление и большого количества запросов на вставку, которые плохо. Автоматически сгенерированные id
строк ордеров также быстро увеличатся, а это не то, что вам нужно.
Какой нормальный подход у Spring Boot и JPA? Должен ли я использовать какие-то каскадные настройки на родительском объекте?
Да, вам следует. Вот пример:
Order. java
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderNumber;
@Version
private Long version = 0L;
@OneToMany(mappedBy="order", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<OrderLine> orderLines;
// equals() and hashcode() implementation
// getter() and setter() implementation
}
OrderLine. java
@Entity
public class OrderLine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long lineNumber;
@ManyToOne
@JoinColumn(name="order_id", nullable=false)
private Order order;
@Version
private Long version = 0L;
// equals() and hashcode() implementation
// getter() and setter() implementation
}
И, наконец, пример обновления:
public boolean update(Order order, long orderLineId, OrderLine updatedOrderLine) {
if(order == null || updatedOrderLine == null)
return false;
if(order.getOrderLines() == null)
return false;
Optional<OrderLine> optTargetOrderLine = order.getOrderLines().stream()
.filter(orderline -> orderLine.getLineNumber() == orderLineId).findFirst();
if(!optTargetOrderLine.isPresent())
return false;
OrderLine targetOrderLine = optTargetOrderLine.get();
// now implement the update function
boolean status = update(targetOrderLine, updatedOrderLine);
// if status is true, you also have to call save() on your OrderRepository
return status;
}