I'm not sure I understood the question but it's definitely possible to define operations to cascade for a one-to-many association (see the section 6.2. Collection mappings). Below, an extract from the Chapter 21. Example: Parent/Child:
You can address the frustrations of
the explicit call to save() by using
cascades.
<set name="children" inverse="true" cascade="all">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
This simplifies the code above to:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
session.flush();
Similarly, we do not need to iterate
over the children when saving or
deleting a Parent
. The following
removes p
and all its children from
the database.
Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();
However, the following code:
Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();
will not remove c
from the database.
In this case, it will only remove the
link to p
and cause a NOT NULL
constraint violation. You need to
explicitly delete()
the Child
.
Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();
In our case, a Child
cannot exist
without its parent. So if we remove a
Child
from the collection, we do want
it to be deleted. To do this, we must
use cascade="all-delete-orphan"
.
<set name="children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
Even though the collection mapping
specifies inverse="true"
, cascades are
still processed by iterating the
collection elements. If you need an
object be saved, deleted or updated by
cascade, you must add it to the
collection. It is not enough to simply
call setParent()
.
References