Подтвердить что ты не робот

Как определить обратное каскадное удаление на многозначном сопоставлении в спящем режиме

У меня есть два класса A и B. Многие B могут иметь ассоциацию с одним A, следовательно, отношение "много-к-одному" от B до A. Я сопоставил отношение как:

<class name="A" table="tbl_A">
  <property name="propA" column="colA"/>
</class>
<class name="B" table="tbl_B">
  <property name="propB" column="colB"/>
  <many-to-one name="a" class="A" column="col1" cascade="delete"/>
</class>

А не имеет ничего сопоставленного с В. Помня об этом, мы намерены удалить B, когда он ассоциирован с A. Это могло бы быть возможно, если бы я мог определить инверсию = "истина" в ассоциации "много-к-одному" в B, но спящий режим не позволяет этого.

Может ли кто-нибудь помочь с этим? Мы не хотим писать что-либо в для этого.

4b9b3361

Ответ 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), должны быть выведены из всех активных сеансов и кеша второго уровня.

Ответ 2

Я думаю, вам нужно cascade="all,delete-orphan" от A до B с ассоциацией one-to-many.