У меня проблема с использованием 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)