我之前的工作背景是使用所有自定义 SQL 和 JDBC 进行所有数据持久化。刚刚为一家小型企业开始了一份新工作,我是唯一的开发人员,并决定使用 Spring Boot 和 JPA 来开发业务系统以实现数据持久性。
我不知道应该如何处理子表的更新。我目前正在使用 Spring Crud 存储库来存储基本表,但已经建立了我的第一个父子关系。
鉴于下面的示例表结构,我应该如何管理更新?
+-------------------------+ | Order | +-------------------------+ | orderNumber | PK | +-------------------------+ +-------------------------+ | OrderLine | +-------------------------+ | orderNumber | PK | +-------------------------+ | lineNumber | PK | +-------------------------+
用户可以更新或删除现有订单行。
进行更新时,我可以先删除所有现有的 orderLine,然后重新创建它们,但不确定这是否是不好的做法?
Spring Boot 和 JPA 的常规方法是什么?
我应该在父实体上使用某种级联设置吗?
最佳答案
When doing an update, I could delete all of the existing orderLines first and recreate them but not sure if this is bad practice?
仅更新需要更新的订单行是最佳实践。
I could delete all of the existing orderLines first and recreate them
这会导致进行大量删除查询和大量插入查询,这是不好的。自动生成的订单行 id
也会快速增加,这不是您想要的。
What is the normal approach with Spring Boot and JPA? Should I be using some kind of cascade settings on the parent entity?
是的,你应该这样做。这是一个例子:
订单.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
}
订单行.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;
}
关于java - Spring Boot JPA如何处理子表更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61134092/