2010-12-10 2 views
1

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

+0

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. –

Antwort

0

Weil Sie Wenn Sie InheritanceType.JOINED verwenden, hat Hibernate keine andere Wahl als die Unterklasse und ihre Basisklasse zu vereinheitlichen.

Wenn Sie InheritanceType.TABLE_PER_CLASS geschaltet (http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_overview_mapping_inher.html) Sie würde dies vermeiden und erhalten Sie Ihre Leistung zurück. Aber ich bin sicher, dass Sie JOINED aus einem bestimmten Grund verwenden :-(

+0

Ich verstehe diesen Anspruch nicht. Wenn die 'Flagge' ein Mitglied von Artikel (die Unterklasse) und nicht von Produkt ist, warum müsste Hibernate die Klassen vereinheitlichen? BTW, zurück im Dezember Ich begann http://lists.jboss.org/pipermail/hibernate-dev/2010-December/005873.html. Eine der Antworten verweist auf http://in.relation.to/Bloggers/MultitableBulkOperations und http://in.relation.to/Bloggers/BulkOperations, die erklären, was hinter den Kulissen passieren könnte. –

1

Ich benutze InheritanceType.JOINED von Hibernate und konfrontiert mit einem ähnlichen Problem, wo Hibernate in die temporäre Tabelle eingefügt wurde und dauerte Ewigkeiten, um die Entitäten zu löschen mit createQuery und executeUpdate, um die Datensätze zu löschen, die das Problem verursacht. mit session.delete(entity) Schritte, die das Problem für mich gelöst.