You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中如何实现@OneToMany关联模型的更新功能?

解决方案

要实现包含发票信息的客户更新功能,结合Panache持久化特性与JPA关联关系处理逻辑,具体实现如下:

1. 调整实体类关联配置(可选但推荐)

在Customer实体的@OneToMany注解中添加orphanRemoval=true,确保当发票从客户的发票列表中移除时,自动从数据库删除对应记录:

@Entity
@Table(name = "customer")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
    // ... 其他属性
    
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "customer_invoices")
    private List<Invoice> invoicesList;
}

2. 实现updateCustomer方法

核心逻辑是先获取数据库中已有的持久化客户实体,更新其基本属性与发票列表,再同步到数据库:

@Override
public Uni<Customer> updateCustomer(Customer customer) {
    // 根据ID查找数据库中的持久化客户实体
    return customerRepository.findById(customer.getId())
            // 找到实体后更新属性
            .onItem().ifNotNull().invoke(existingCustomer -> {
                // 更新客户基本信息
                existingCustomer.setName(customer.getName());
                
                // 替换发票列表:依托cascade=ALL和orphanRemoval处理新增、更新、删除
                // 传入的Invoice中,带有效ID的会被更新,无ID的会被新增,不在新列表的旧发票会被删除
                existingCustomer.setInvoicesList(customer.getInvoicesList());
            })
            // 持久化更新并刷新到数据库
            .call(existingCustomer -> customerRepository.persistAndFlush(existingCustomer))
            // 处理客户不存在的情况,抛出异常(可根据业务需求调整)
            .onItem().ifNull().failWith(() -> new IllegalArgumentException("客户ID不存在:" + customer.getId()));
}

关键说明

  • 托管实体操作:findById获取的是JPA托管状态的实体,修改其属性后,persistAndFlush会自动将变更同步到数据库。
  • 发票列表处理规则:
    • 新增发票:传入的Invoice对象ID为空(或为0,对应IDENTITY生成策略)时,会被自动持久化。
    • 更新发票:传入的Invoice对象带有有效ID时,JPA会自动更新其属性。
    • 删除发票:启用orphanRemoval=true后,原列表中不在新列表的发票会被自动删除;若无需自动删除,可移除该属性,但需手动处理旧发票的删除逻辑。

内容的提问来源于stack exchange,提问作者Mohamed Jihed Jaouadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:05:36