【问题标题】:@OneToMany detached entity passed to persist@OneToMany 分离实体传递给持久化
【发布时间】:2018-12-19 16:35:39
【问题描述】:

在订单表中插入时遇到此错误

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: org.vi.entities.LineItem; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: org.vi.entities.LineItem

映射 这就是我映射我的课程的方式:

@Entity
public class Order implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    @Column(name = "delivered", nullable = false)
    private boolean delivered;
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "fk_order")
    private Set<LineItem> lineItems= new HashSet<LineItem>();
}
@Entity
public class LineItem implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    @Column(name="quantity", nullable = false)
    private int quantity;
    @ManyToOne
    private Product product;
}
@Entity
public class Product implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;    
    @Column(name = "reference", unique = true, nullable = false)
    private String reference;
    @Column(name = "price", nullable = false)
    private double price;
}

在我的表格中插入 这就是我在表中保存新行的方式

Product p1 = new Product("reference1",10000);
Product p2 = new Product("reference2",20000;
productRepository.save(p1);productRepository.save(p2);

LineItem li1 = new LineItem(6, p1);
LineItem li1 = new LineItem(9, p2);
lineItemRepository.save(li1);lineItemRepository.save(li2);

Set<LineItem> lineItems1= new HashSet<LineItem>();
lineItems1.add(li1);
lineItems1.add(li2);

Order o1 = new Order(false,lineItems1);
orderRepository.save(o1);

如果映射有问题,您能帮我吗?

【问题讨论】:

  • 能否添加Order的构造函数?
  • @aBnormaLz public Order(boolean Delivered, Set lineItems) { super(); this.delivered = 已交付; this.lineItems = lineItems; }
  • 你不使用事务?
  • @Christine 不,我不需要,我必须使用交易吗?
  • 您不必这样做,但这样更安全。有时你会得到一个由前一个事务引起的“分离实体”。如果你不使用事务,我不知道是否会发生类似的事情。您在哪一行得到异常?

标签: java hibernate spring-data-jpa


【解决方案1】:

试试下面:

Order o1 = new Order(false,lineItems1);
o1.getLineItems().add(new LineItem(6, p1););
o1.getLineItems().add(new LineItem(6, p1););
orderRepository.save(o1);

不要创建一个新的 HashSet,而是使用 order 中的现有一个,因为那是 hibernate 正在跟踪的对象。

【讨论】:

  • 您的建议对我有用,谢谢,但在 line_item 表中,只插入了每个订单的第一个 LineItem..
【解决方案2】:

我认为您应该尝试删除lineItemRepository.save(li1);lineItemRepository.save(li2); 行,因为CascadeType.ALL 也会保留Set&lt;LineItem&gt;

【讨论】:

    【解决方案3】:

    替换这段代码,

     LineItem li1 = new LineItem(6, p1);
        LineItem li2 = new LineItem(9, p2);
        lineItemRepository.save(li1);lineItemRepository.save(li2);
    

    如有问题请告知。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2017-04-01
      • 2018-09-22
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2018-09-09
      • 2015-12-26
      相关资源
      最近更新 更多