Hibernate только каскады вдоль определенных ассоциаций. Если A ничего не знает о Bs, то ничего, что вы делаете с A, не повлияет на Bs.
Поэтому предложение Паскаля - самый простой способ сделать то, что вы хотите:
<class name="A" table="tbl_A">
...
<set name="myBs" inverse="true" cascade="all,delete-orphan">
<key column="col1"/>
<one-to-many class="B"/>
</set>
</class>
<class name="B" table="tbl_B">
...
<many-to-one name="a" class="A" column="col1" not-null="true"/>
</class>
Обратите внимание, что установка cascade="delete"
на B
в том виде, в каком она есть в исходном коде, НЕ будет делать то, что вы хотите - она говорит Hibernate «удалить A, если B удален», что может привести к нарушению ограничения (если есть другие B, связанные с этим A).
Если вы абсолютно не можете добавить коллекцию B к A (хотя я не могу вспомнить обстоятельства, при которых это имело бы место), ваша единственная другая альтернатива - определить каскадное удаление из A в B в иностранном ключевой уровень; ваш B будет удален, когда ваш A будет удален.
Это довольно уродливое решение, потому что вы должны быть очень осторожны с тем, как вы удаляете A в Hibernate:
- Сессия должна быть сброшена перед удалением A (наличие ожидающих обновлений B может привести к ошибке или к тому, что A и некоторые B будут повторно вставлены за кулисы)
- Все B, связанные с вашей A (и поскольку вы не поддерживаете отношения со стороны A, что означает все B), должны быть удалены из всех активных сессий и кэша 2-го уровня.