Správná odpověď by byla použít následující tvrzení:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Poté se však objeví problém, že hibernace neobdržela zpět hodnotu automatického přírůstku, jakmile byl proveden příkaz aktualizace.
Našel jsem následující blogový příspěvek (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) a upravil dotaz na následující:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
což konečně funguje.
Neřešitelným problémem tohoto přístupu je, že nefunguje vložení dvou entit, které jsou stejné v rámci stejné transakce. I kdyby druhé vložení způsobilo správnou aktualizaci, em by skončily se 2 instancemi entity představujícími stejný řádek databáze - což není povoleno.
Chcete-li to vyřešit, stačí zajistit, abyste nevložili 2 entity, které jsou kvůli svým omezením vykresleny stejně. (Použil jsem stejnou logiku pro rovné/hashcode jako omezení složeného jedinečného klíče, takže jsem schopen takové duplikáty eliminovat při provádění dávkových vložení)