I'm using JPA over Hibernate in my web-app. Here are two entities (only getters are shown):
class Child { private Parent parent; @ManyToOne(optional=false) @JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false) public Parent getParent() { return parent; } } class Parent { private Collection<Child> children; @OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL}) public Collection<Child> getChildren() { return children; } }
As you see Parent
and Child
relate as "one-to-many".
Now I need to load a Parent
instance, remove some or all children and save the changes. Below is code which does not work for me:
Parent p = entityManager.find(Parent.class, 12345L); // load entity p.getChildren().clear(); // remove all children entityManager.merge(p); // try to save
Child entities are not remove in the example above. Now I have to manually call entityManager.remove()
for each child.
Is there any easier way to manage child collection?
Please notice that I don't want to use Hibernate-specific functionality, only pure JPA.
First, we'll start with CascadeType. REMOVE which is a way to delete a child entity or entities when the deletion of its parent happens. Then we'll take a look at the orphanRemoval attribute, which was introduced in JPA 2.0. This provides us with a way to delete orphaned entities from the database.
If an entity that is the target of the relationship is removed from the relationship (by setting the relationship to null or removing the entity from the relationship collection), the remove operation will be applied to the entity being orphaned. The remove operation is applied at the time of the flush operation.
For JPA 2.0 you can set orphanRemoval=true
of the @OneToMany
For JPA 1.0, you should use hibernate-specific annotations. That is the @Cascade
annotation (instead of the cascade
attribute), with a value of
@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
Hibernate 3.5+ implement JPA 2.0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With