Issue
I've a Set in my Parent entity as below:
Class Parent {
@OneToMany(mappedBy = parent, cascade = CasacadeType.ALL)
Set<Child> children;
}
Class Child {
@Column(nullable=false)
@ManyToOne
Parent parent;
}
Now event if I do a remove() operation on the Set for one of its element it doesn't actually get removed.
Solution
Your mapping should look like this:
public class Parent {
@OneToMany(mappedBy = parent, cascade = CasacadeType.ALL, orphanRemoval = true)
private Set<Child> children = new HashSet<>();
public void removeChild(Child child) {
children.remove(child);
child.setParent(null);
}
}
public class Child {
@ManyToOne
private Parent parent;
}
Because you have a bidirectional association you have to have both sides in-sync.
Therefore, it's good practice to call:
parent.removeChild(child);
This way, removeChild
is going to remove the Child
from the children
Set
and also set the Child
parent
association to null
.
Answered By - Vlad Mihalcea
Answer Checked By - Willingham (JavaFixing Volunteer)