我以前的工作背景是来自使用所有自定义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/

10-12 00:38
查看更多