views:

7925

answers:

1

Lets say I have two tables - "child" and "parent" with many-to-one relation. What I need is to delete child entries if parent record is deleted.

It is not a problem if I link child table from parent by creating one-to-many association in parent.hbm and set cascade="all-delete-orphan".

The problem is I don't want one-to-many relation on the parent side, so I created many-to-one on the child side. The reason for that is child table is pretty big and I don't want to extract hundreds of records every time I use parent. So my configuration looks like this:

child.hbm:

<many-to-one name="parent" class="com.example.Parent" column="parentid"/>

while parent.hbm has no associations with child.

The question is: How to make Hibernate delete records from child table when deleting a parent if a child is linked to a parent with many-to-one?

Thanks.

+5  A: 

Couple of options:

  • add the one-to-many to the parent with cascading delete, but mitigate the performance loss using lazy loading.

  • use a Hibernate Interceptor (or an aspect in an AOP environment) to detect parent record deletions and delete children.

Personally I would favour the first option, as it lets your data model more closely reflect the real relationships in your data.

Edit: there's a third option, but it's not pleasant - use a database trigger, and flush your Hibernate cache (or use a non-caching session).

Dan Vinton
I was almost compelled to DV after reading your trigger option! I'm glad you didn't include that as a real solution.
Chris Marisic