Spring,JPA - 双向@OneToMany:用另一个替换子列表

时间:2017-02-21 12:53:07

标签: spring jpa spring-boot

我已经阅读了很多主题,并进行了数百次实验,但到目前为止还没有成功。我有以下课程:

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 个答案:

答案 0 :(得分:2)

找到解决方案。

我应该有orphanRemoval = true:

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

现在由于@ManyToOne中的其他级联而删除了父级。我将其更改为以下内容:

@ManyToOne(cascade = {CascadeType.MERGE})

现在可行。