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

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

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

Вот пример используемого 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)


arrow_upward
7
arrow_downward

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

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

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

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

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

arrow_upward
0
arrow_downward

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

  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