Hibernate; HQL; почему запрос на удаление не работает, а select работает? - PullRequest
5 голосов
/ 20 января 2010

Я хочу удалить определенные записи из таблицы. Эти записи имеют несколько дочерних записей в других таблицах.

Чтобы иметь возможность удалять основные записи, я должен сначала удалить дочерние записи.

Вот пример используемого HQL:

delete from ItineraryBooking ib where ib.booking.user.id = :paramId

В основном, это должно удалить все ItineraryBookings (записи в отдельной таблице), они присоединяются к таблице бронирования Таблица бронирования может быть объединена с таблицей пользователя.

Странно то, что если вы измените вышеприведенное на:

from ItineraryBooking ib where ib.booking.user.id = :paramId

И выполните Query.list (), он будет работать нормально.

Всякий раз, когда я хочу выполнить вариант удаления, похоже, что Hibernate генерирует нечетный оператор удаления. Мой HQL не так? Или это спящий Hibernate?

Ответы [ 2 ]

7 голосов
/ 20 января 2010

Из руководства по гибернации :

Нет соединений, явных или неявных, может быть указан в массовом запросе HQL. Подзапросы могут быть использованы в where-предложение, где подзапросы сами могут содержать соединения.

Ваше предложение ib.booking.user.id выглядит как соединение со мной. Я не знаю, активно ли Hibernate отклоняет объединения в операторе удаления или просто молча ошибается.

Лучший способ удалить дочерние записи - использовать каскадное удаление .

0 голосов
/ 20 января 2010

Простые вопросы, которые могут помочь:

  1. Просто для любопытства, вы используете этот HQL в транзакции? Для select не требуется транзакция, но для удаления она нужна.

  2. Вы очищаете сеанс после выполнения удаления HQL?

  3. Вы удаляете и выбираете в той же транзакции или в отдельных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...