Article
сущность является подклассом сущности Product
. Стратегия наследования для них - joined
. Article#flag
- это логический атрибут, который я хочу установить false для всех статей. Следовательно, я делаю
Query query = entityManager.createQuery("update Article set flag=:flagValue");
query.setParameter("flagValue", false);
query.executeUpdate();
Я ожидал, что это приведет к одному SQL-выражению для базы данных, которое должно завершиться довольно быстро. Вместо этого Hibernate заполняет временную таблицу (которая физически не существует в базе данных) и запускает in-query т.е. обновление позже:
insert into HT_article select article0_.id as id from schema.article article0_ inner join schema.product article0_1_ on article0_.id=article0_1_.id
update schema.article set flag=0 where (id) IN (select id from HT_article)
Фактический оператор обновления требует «навсегда» для завершения и блокирует уязвимые статьи, вызывая тем самым исключения блокировки в других транзакциях. Под вечностью я подразумеваю более часа для 130000 статей.
Чем объясняется такое поведение и как я могу его решить? Помимо выполнения собственного запроса, я имею в виду ...
Обновление 2011-05-12: это ужасно медленно, потому что запрос медленно, я подал ошибку для этого -> http://opensource.atlassian.com/projects/hibernate/browse/HHH-5905