无法为单个客户保存多订单: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
相关产品推荐
相关产品推荐

