Article
Einheit ist eine Unterklasse der Einheit. Die Vererbungsstrategie für sie ist joined
. Article#flag
ist ein boolesches Attribut, das ich für alle Artikel falsch setzen möchte. Also, ich macheHibernate Bulk-Update führt zu In-Abfrage, die für immer dauert
Query query = entityManager.createQuery("update Article set flag=:flagValue");
query.setParameter("flagValue", false);
query.executeUpdate();
Ich erwartete, dass dies zu einer einzigen SQL-Anweisung gegen die Datenbank führen, die ziemlich schnell abgeschlossen werden sollte. Stattdessen füllt Hibernate eine temporäre Tabelle (die physisch nicht in der Datenbank vorhanden ist) und führt eine In-Abfrage aus, dh. später das Update:
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)
Die eigentliche Update-Anweisung „für immer“ zu beenden und sperrt die betroffenen Artikel wodurch Sperre Ausnahmen in anderen Transaktionen erfolgt. Für immer bedeute ich mehr als eine Stunde für 130000 Artikel.
Was ist die Erklärung für dieses Verhalten und wie könnte ich es lösen? Anders als eine native Abfrage läuft ich meine ...
-Update 2011-05-12: es schrecklich langsam ist, weil die in-Abfrage ist langsam, ich für diesen einen Fehler abgelegt ->http://opensource.atlassian.com/projects/hibernate/browse/HHH-5905
es wert ist zu erwähnen, dass auch 'Abfrage query = getEntityManager(). Create ( „update Artikel Einstellmerker = false wo articleNumber in (: articleNumbers) "); query.setParameter (" articleNumbers ", articleNumbers);' führt uns zur selben schrecklich langsamen Verarbeitung in der HT_article-Tabelle. –