我以前的工作背景是来自使用所有自定义SQL和JDBC进行所有数据持久化的角色。刚刚为我是唯一的开发人员的一家小型企业开始了新工作,并决定使用Spring Boot和JPA来开发业务系统以实现数据持久性。
我不知道我应该如何处理子表上的更新。我目前正在使用Spring Crud Repository来存储基本表,但已达到我的第一个父子关系。
给定下面的示例表结构,我应该如何管理更新?
+ ------------------------- +
|订购|
+ ------------------------- +
| orderNumber | PK |
+ ------------------------- +
+ ------------------------- +
|订单行|
+ ------------------------- +
| orderNumber | PK |
+ ------------------------- +
| lineNumber | PK |
+ ------------------------- +
用户可以更新或删除现有的订单行。
在进行更新时,我可以先删除所有现有的orderLine,然后重新创建它们,但不确定这是否不好?
Spring Boot和JPA的正常方法是什么?
我应该在父实体上使用某种级联设置吗?
最佳答案
在进行更新时,我可以先删除所有现有的orderLine,然后重新创建它们,但不确定这是否不好?
最佳做法是仅更新需要更新的订单行。
我可以先删除所有现有的orderLine,然后重新创建它们
这将导致产生大量的删除查询和大量的插入查询,这很糟糕。自动生成的订单行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;
}
关于java - Spring Boot JPA如何处理子表更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61134092/