2017-02-21 22 views
0

Я прочитал много тем на этом и сделал сотни экспериментов, но пока никаких успехов. У меня есть следующие классы:Весна, JPA - двунаправленная @OneToMany: замените список детей другим

class Parent { 
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL/*, orphanRemoval=true*/) 
    private List<Child> children = new ArrayList<>(); 

class Child { 
    @ManyToOne(cascade = {CascadeType.ALL}) 
    @JoinColumn(name = "parentId", nullable = false) 
    @JsonIgnore 
    Parent parent; 
} 

Что я могу сделать, это попытаться заменить children список с одной представленной в запросе PATCH:

Hibernate.initialize(fromDb.getChildren()); 
    entityManager.detach(fromDb); // detach from JPA. I need this 

    List<Child> newChildren = fromClient.getChildren(); 

    fromDb.getChildren().clear(); // get rid of all old elements 

    for (Child child : newChildren) { // add the new ones 
     child.setParent(fromDb); 
     fromDb.getChildren().add(child); 
    } 

    ParentRepository.save(merged); 

Поведение следующее:

  • , когда я его запускаю как он есть, он добавляет новые, но оставляет старые ! Так что у меня растет число нежелательных детей (извините ..)
  • когда я расторжение orphanRemoval=true часть ... родитель удален!

Можете ли вы объяснить, почему это так, и что я могу сделать здесь?

+1

Потому что это то, что вы его настроили ... Вы удалили 'orphanRemoval = true'. Проблема в том, что вы все каскадируете в цикле. Удалите каскад из родительского поля в дочернем объекте. –

+0

спасибо, похоже, что я нашел одну и ту же проблему самостоятельно в одно и то же время :) – kiedysktos

ответ

0

Решение найдено.

я должен orphanRemoval = истина:

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval=true) 

Теперь удаляется родительский из другого каскада в @ManyToOne. Я изменил его на следующее:

@ManyToOne(cascade = {CascadeType.MERGE})

Теперь она работает.