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

无法为单个客户保存多订单:detached entity passed to persist异常排查

问题排查:Hibernate保存多订单时抛出detached entity异常

我已创建Customer与Order实体类,建立了一对多(One-To-Many)和多对一(Many-To-One)的双向映射,双方的CascadeType均设置为REFRESH、PERSIST、MERGE、DETACH,未包含CascadeType.DELETE。

运行JUnit测试用例CanFindAllOrders时,我创建了一个Customer对象和3个Order对象,将每个Order关联到该Customer,通过OrderService依次保存3个订单,仅第一个订单保存成功,第二个订单抛出异常:

detached entity passed to persist: com.yavaar.nosi.crm.entity.Customer

Hibernate成功执行了Customer的插入和第一个Order的插入,但第二个Order插入时触发上述异常。我尝试修改级联类型但无效,请求帮助排查问题。

相关代码

Customer类

@Entity
@Table(name = "customer")
public class Customer {

    @OneToMany(mappedBy = "customer", cascade = {CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, fetch = FetchType.LAZY)
    private List<Order> orders;

}

Order类

@Entity
@Table(name = "customerorder")
public class Order {

    @ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, fetch = FetchType.EAGER)
    @JoinColumns(
            {
                    @JoinColumn(updatable = true, insertable = true, name = "customer_id", referencedColumnName = "id"),
                    @JoinColumn(updatable = true, insertable = true, name = "first_name", referencedColumnName = "first_name"),
                    @JoinColumn(updatable = true, insertable = true, name = "last_name", referencedColumnName = "last_name")
            }
    )
    private Customer customer;

}

JUnit测试用例

@Test
void canFindAllOrders() {

    Customer customer = new Customer("John", "Doe","john@gmail.com",
            LocalDate.of(1987, 9, 3));
    Order order = new Order(LocalDate.of(2024, 01,02), new BigDecimal("100.00"),
            new BigDecimal("20.00"), new BigDecimal("120.00"));

    Order order1 = new Order(LocalDate.of(2023, 12,11), new BigDecimal("200.00"),
            new BigDecimal("40.00"), new BigDecimal("240.00"));
    Order order2 = new Order(LocalDate.of(2022, 9,01), new BigDecimal("300.00"),
            new BigDecimal("60.00"), new BigDecimal("360.00"));

    order.setCustomer(customer);
    order1.setCustomer(customer);
    order2.setCustomer(customer);

    orderService.saveOrder(order);
    orderService.saveOrder(order1);
    orderService.saveOrder(order2);

    List<Order> orders = orderService.findAllOrders();

    assertEquals(3, orders.size());

}

内容的提问来源于stack exchange,提问作者Yavaar Nosimohomed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:20:10