Как удалить дочерние записи вместо установки внешнего ключа на ноль - PullRequest
3 голосов
/ 19 сентября 2010

У меня есть пользователь и набор полномочий в отношении «один ко многим»:

User.hbm.xml:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" />
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

Когда я удаляю пользователя, я хочутакже удалить полномочия, но происходит то, что внешний ключ дочерней таблицы (members.user_id) вместо этого имеет значение null.Затем я получаю следующую ошибку, и удаление пользователя откатывается:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Обновление Nuclear.user_id, однако, не откатывается.

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

РЕДАКТИРОВАТЬ: Я получил это, явно удалив полномочия, вызвав refresh() для пользователя, затем удалив пользователя, но я хотел бы знать, "правильный" способ сделать это.

1 Ответ

1 голос
/ 19 сентября 2010

Это странно, каскад all-delete-orphan должен каскадировать операцию delete от родителя к потомкам.Таким образом, для удаления дочерних элементов должно быть достаточно:

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();

Получаете ли вы другой результат при использовании all,delete-orphan или даже проще delete (вы не должны).Является ли ассоциация двунаправленной?Если да, не могли бы вы показать другую сторону и соответствующее сопоставление?

Ассоциация только от родителя к ребенку, и я получаю те же результаты со всеми, delete-orphan, и delete, НО...У меня не было session.flush (), и это, похоже, решило проблему.

Явная очистка может помочь.Но это не должно быть необходимым.Я думаю , что определение внешнего ключа как необнуляемого поможет получить правильное поведение:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" not-null="true"/>
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

Не проверено, хотя.

...