Спящий режим; высокий уровень качества; почему запрос на удаление не работает, а выбор работает?

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

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

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

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

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

Странно то, что когда вы меняете приведенное выше на:

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

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

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


person Stefan Hendriks    schedule 20.01.2010    source источник


Ответы (2)


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

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

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

Более удобный способ удаления дочерних записей — использовать каскадное удаление.

person skaffman    schedule 20.01.2010
comment
Да, вы правы, они объединены. Я рассмотрю функцию каскадного удаления, потому что я считаю, что она должна работать именно так, но это просто не так. Была причина, по которой другие связанные записи должны были быть удалены явным образом. Спасибо за ответ! - person Stefan Hendriks; 21.01.2010

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

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

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

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

person Omar Al Kababji    schedule 20.01.2010
comment
1. Удаление в транзакции 2. Да 3. Отдельные транзакции - person Stefan Hendriks; 21.01.2010
comment
Может быть у вас проблемы с кэшированием? Я имею в виду, что данные удалены из БД, но все еще присутствуют в памяти? попробуйте очистить сеансы перед выполнением запросов, может быть, это поможет. - person Omar Al Kababji; 21.01.2010