При сохранении загруженного объекта обновленная дочерняя коллекция завершается с помощью Spring Data JPA (Hibernate) - PullRequest
0 голосов
/ 23 октября 2019

У меня проблема с использованием Spring Data JPA для сохранения сущности, имеющей двунаправленное отношение OneToMany, к другой сущности.

Когда я пытаюсь сохранить родительскую сущность, используя JpaRepository, Hibernate всегда выдает исключение org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: package.Parent.children

Я могу найти несколько постов здесь, на StackOverflow, об этой проблеме, но ни одна из них не помогает мне, большинство предлагает, чтобы никто не заменял коллекцию в setChildren, но я этого не делаю. Другие предлагают проверить «равные» и hashCode для Child, но я не могу найти в них ничего плохого.

@Entity
@Table(name = "parent")
public class Parent {
    private Integer id;
    private List<Child> children = new ArrayList<>();

    @Id
    @Column(name = "id", nullable = false)
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    public List<Child> getChildren() { return children; }

    public void setChildren(List<Child> children) {
        this.children.clear();
        if (children != null) {
            this.children.addAll(children);
        }
    }
}

@Entity
@Table(name = "child")
public class Child {
    private String id;
    private Parent parent;

    @Id
    @Column(name = "id", nullable = false, length = 150)
    public String getId() { return is; }
    public void setId(String id) { this.id = id; }

    // I have tried different cascade settings, including not setting any, but nothing has worked
    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
    @JoinColumn(name = "parent", referencedColumnName = "id", nullable = false)
    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) { this.parent = parent; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ParentAlias that = (ParentAlias) o;
        return getAlias().equals(that.getAlias());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getAlias());
    }
}

@Repository
public interface ParentRepository extends JpaRepository<Parent, Integer> {}

// Will throw exception when saving:
parentRepository.findById(1).ifPresent(p -> {
    System.out.println(p.getChildren());
    parentRepository.save(p);
}

Почему это происходит? Как видно из кода, я даже не изменяю коллекцию children. Я использую Spring Boot 2.1.8 (который дает данные Spring JPA 2.1.10, Hibernate 5.3.11)

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