![](/img/trans.png)
[英]Spring Boot Data JPA detached entity passed to persist on @OneToMany and @OneToOne
[英]@OneToMany detached entity passed to persist
在訂單表中插入時會遇到此錯誤
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 o1 = new Order(false,lineItems1);
o1.getLineItems().add(new LineItem(6, p1););
o1.getLineItems().add(new LineItem(6, p1););
orderRepository.save(o1);
不用創建新的HashSet,而是使用現有的from順序的,因為這是hibernate跟蹤的對象。
我認為您應該嘗試刪除lineItemRepository.save(li1);lineItemRepository.save(li2);
行,因為CascadeType.ALL
還將保留Set<LineItem>
。
替換此代碼,
LineItem li1 = new LineItem(6, p1);
LineItem li2 = new LineItem(9, p2);
lineItemRepository.save(li1);lineItemRepository.save(li2);
如果有任何問題,請告知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.