Skip to content
Advertisement

JPA OneToMany not deleting child

I have a problem with a simple @OneToMany mapping between a parent and a child entity. All works well, only that child records are not deleted when I remove them from the collection.

The parent:

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}

The child:

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

If I now delete and child from the childs Set, it does not get deleted from the database. I tried nullifying the child.parent reference, but that did not work either.

The entities are used in a web application, the delete happens as part of an Ajax request. I don’t have a list of deleted childs when the save button is pressed, so I can’t delete them implicitly.

Advertisement

Answer

JPA’s behaviour is correct (meaning as per the specification): objects aren’t deleted simply because you’ve removed them from a OneToMany collection. There are vendor-specific extensions that do that but native JPA doesn’t cater for it.

In part this is because JPA doesn’t actually know if it should delete something removed from the collection. In object modeling terms, this is the difference between composition and “aggregation*.

In composition, the child entity has no existence without the parent. A classic example is between House and Room. Delete the House and the Rooms go too.

Aggregation is a looser kind of association and is typified by Course and Student. Delete the Course and the Student still exists (probably in other Courses).

So you need to either use vendor-specific extensions to force this behaviour (if available) or explicitly delete the child AND remove it from the parent’s collection.

I’m aware of:

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement