Ответ 1
Спящий режим только каскадирует вдоль определенных ассоциаций. Если 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 удален", что может привести к нарушению ограничения (если есть другие Bs, связанные с этим A).
Если вы абсолютно не можете добавить коллекцию Bs в (хотя я не могу действительно думать об обстоятельствах, когда это будет так), ваша единственная альтернатива - это определение каскадного удаления из A в B на чужом ключевой уровень; ваши Bs будут удалены, когда ваш A будет удален.
Это довольно уродливое решение, потому что вы должны быть очень осторожны с тем, как вы удаляете A в спящем режиме:
- Сессия должна быть очищена до удаления A (наличие ожидающих обновлений B может привести к ошибке или A, а некоторые Bs будут вставлены за кулисами)
- Все Bs, связанные с вашим A (и поскольку вы не поддерживаете отношения со стороны A, что означает all Bs), должны быть выведены из всех активных сеансов и кеша второго уровня.