JPA Исключение спасения родителей / детей - PullRequest
0 голосов
/ 07 декабря 2018

Я использую JPA и имею следующее:

ProductEntity 

@Basic
@Column(name = "PRODUCT_ID", nullable = false, length = 128)
private String productId;

@ManyToOne
@JoinColumn(name = "PARENT_ID")
private ProductEntity parent;

Как вы можете видеть, таблица продуктов может иметь родителя.Фактически родительские дочерние отношения.

У меня есть продукт, сохраненный в базе данных, затем я добавляю несколько дочерних продуктов, каждый из которых имеет одного и того же родителя.

  • Родительский продукт имеет ProductEntity parent =ноль;
  • Дочерние продукты имеют ProductEntity parent = родительский продукт;

    ProductEntity parentProductEntity = ...
    ProductEntity childProductEntity1 = ...
    ProductEntity childProductEntity2 = ...
    
    em.persist(parentProductEntity);
    childProductEntity1.setParent(parentProductEntity);
    childProductEntity2.setParent(parentProductEntity);
    em.merge(childProductEntity1);
    

Данные (никогда не вставляются последние две дочерние строки)

    ID        PRODUCT_ID     PARENT_ID
     1           1              null
     2           2                1
     3           3                1

Проблема

Затем я пытаюсь сохранить каждый дочерний продукт.Но я получаю сообщение об ошибке, указывающее на наличие дублированного ключа (productId).При сохранении дочернего элемента он также пытается сохранить дублирующую запись родительского элемента.

Причина: org.postgresql.util.PSQLException: ОШИБКА: значение дублирующего ключа нарушает уникальное ограничение "t_osm_product_product_id_uindex"

Вопрос

Как мне изменить то, что я делаю, чтобы успешно спасти каждого ребенка?

Спасибо

Ответы [ 3 ]

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

Пожалуйста, измените следующую точку и проверьте: -

  • Используйте «persist» вместо «merge» и выполните следующую последовательность.

{

public static void main (String[] agrs){
EntityManager em = ... // from EntityManagerFactory, injection, etc.

em.getTransaction().begin();

A parent   = new A();
A son      = new A();
A daughter = new A();

son.setParent(parent);
daughter.setParent(parent);

em.persist(parent);
em.persist(son);
em.persist(daughter);

em.getTransaction().commit();
}
0 голосов
/ 09 декабря 2018

ваша сущность должна выглядеть следующим образом

@Id
Long ID;

@Column(name = "PRODUCT_ID", nullable = false, length = 128)
private String productId;

@ManyToOne
@JoinColumn(name = "PARENT_ID")
private ProductEntity parent;

все остальное в вашем коде выглядит нормально.

Данные в базе данных будут выглядеть так

 ID        PRODUCT_ID     PARENT_ID
 1           abc              null
 2           def                1
 3           xyz                1
0 голосов
/ 07 декабря 2018

Вы можете попробовать @ManyToOne(cascade=CascadeType.MERGE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...