2015-11-30 4 views

ответ

0

Да. Вы можете построить собственный SQL-запрос, получив экземпляр SQLQuery из сеанса. Используйте addEntity, чтобы сообщить hibernate тип объекта, возвращаемого запросом. Hibernate будет правильно управлять экземплярами объектов, которые возвращаются.

Другой аспект, который вам нужно знать, - это кеширование. Hibernate не понимает собственный запрос, поэтому он не знает, к каким таблицам обращаются. Это означает, что спящий режим не может автоматически очистить кеши, чтобы убедиться, что запрос видит текущее состояние базы данных. Это приводит к неправильным результатам, которые могут быть тонкими и трудно идентифицируемыми.

Исправление проблемы кэширования/промывки состоит в том, чтобы указать экземпляр SQLQuery, к которому обращаются типы сущностей. Используйте методы addSynchronized*, чтобы сообщить, что происходит в спящем режиме, что происходит в запросе, а спящий режим будет выполнять всю тяжелую работу.

+0

Query deleteQuery = session.createQuery ("УДАЛИТЬ ОТ XYZ WHERE COL =: value"); В этом случае, как hibernate проверяет VERSION перед удалением записей? – Sam

+0

Оптимистическая блокировка не является проблемой для этого запроса. Информация о версии используется для обеспечения того, чтобы при обновлении, которое никто еще не обновлял строку, тем временем. Вам все еще нужно сообщить hibernate, что вы что-то сделали для таблицы XYZ, если вы хотите, чтобы кеширование работало правильно. – Rob

+0

Просто установите hibernate.show_sql в true и запустите собственный запрос, вы увидите, обновлено ли поле версии или нет. – awahaani

Смежные вопросы