JPA OneToMany not deleting child

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:

Leave a Comment