Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing child from collection using JPA

Tags:

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.

like image 950
Andrey Avatar asked Sep 17 '10 20:09

Andrey


People also ask

How do you delete child records when parent is deleted in 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.

How do you delete a one to many relationship in JPA?

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.


1 Answers

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

like image 92
Bozho Avatar answered Sep 25 '22 01:09

Bozho