Производительность запроса Hibernate для удаления объекта - PullRequest
1 голос
/ 05 октября 2010

Я разрабатываю простой веб-сервис: void deleteCar (int idCar)

В настоящее время я делаю в своем коде следующее:
1 - загружаю объект автомобиля по id: session.get (Car.class, idCar)
2 - удалить его: session.delete (carLoaded)

Так что для операции у меня есть как минимум 2 sql запроса (n + 1 проблема?)
Я недаже говорить о любых не ленивых отношениях в автомобиле, которые приведут к большему количеству запросов SQL.

Я подумал, что для использования HQL-запроса:
1 - проверит по идентификатору, существует ли машина с lockMode.UPGRADE (boolean carDao.exist (int id)) 2 - если машина существует, используйте hql-запрос, подобный этому: "delet from Car c, где c.id =?"

Но как кеш может реагировать на это (мы будем использовать ehCache)

В первом решении я почти уверен, что машинабудет удален из кэша 2-го уровня.

Во 2-м решении (с hql-запросом) будет ли кэш достаточно интеллектуальным, чтобы удалить автомобиль, загруженный в кэш 2-го уровня?

1 Ответ

0 голосов
/ 06 октября 2010

Так что для операции у меня есть как минимум 2 sql запроса (n + 1 проблема?)

Проблема N + 1 возникает, когда вы извлекаете N сущностей (с 1 запросом), и для получения чего-либо необходимо выполнить дополнительный запрос для каждой сущности (всего N). Это не совсем так.

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

Что ж, если у вас есть график объектов, вам потребуется несколько запросов на удаление. Разве вы не счастливы, что Hibernate может каскадировать их для вас?

Я решил использовать HQL-запрос, который (...)

Во-первых, я не вижу смысла первого выбора (я думал, что вы хотите ограничить количество запросов).

Во-вторых, массовый HQL DELETE действительно спасет SELECT, но он не распространяется на связанные сущности, что может быть проблемой в вашем случае (поэтому вам придется обрабатывать отношения самостоятельно, если возможно).

Не уверен, что это подойдет вашим потребностям.

Но как кеш может реагировать на это

Hibernate сделает недействительными необходимые регионы после завершения «массовой операции».

См. Массовые операции для получения подробной информации и рекомендаций по их использованию.

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