java - Spring Boot JPA如何处理子表更新

标签 java spring-boot jpa data-persistence

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

相关文章:

java - 使用继承时Spring Boot Swagger重复模型类型

java - JPA:使用复合键的多个一对多关系

java - JPA EntityManager 无法在 PostInsertEventListener 中刷新

java - 必须安装 Java 才能运行 Java 应用程序吗?

java - lambda 替换 Anonymous new Runnable() 是如何工作的?

java - 错误:无法访问jarfile(Kubernetes)

mysql - 如何在 JPA(而不是 JPQL)中选择实体的一部分?

java - 如何在jmeter中创建和调用自定义函数

java - 如何通过 AWS Lambda 调用 IPv6 REST 服务

grails - Grails 3 + Springboot依赖项