@OneToMany отдельная сущность передана для сохранения - PullRequest
0 голосов
/ 19 декабря 2018

Я сталкиваюсь с этой ошибкой при вставке в таблицу заказов

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);

Не могли бы вы помочь мне, если в отображении есть проблема?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Попробуйте ниже:

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

Вместо создания нового HashSet используйте существующий из порядка, поскольку это объект, который отслеживает hibernate.

0 голосов
/ 19 декабря 2018

Замените этот код,

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

, если возникнут проблемы, сообщите.

0 голосов
/ 19 декабря 2018

Я думаю, вы должны попытаться удалить строку lineItemRepository.save(li1);lineItemRepository.save(li2);, так как CascadeType.ALL будет сохраняться, т.е. Set<LineItem>.

...