Het juiste antwoord zou zijn om de volgende verklaring te gebruiken:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Maar dan blijkt het probleem dat de slaapstand geen auto-incrementwaarde terug heeft ontvangen, nadat de update-instructie is uitgevoerd.
Ik vond de volgende blogpost (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) en wijzigde de query in het volgende:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
wat eindelijk werkt.
Een onoplosbaar probleem met deze benadering is dat het invoegen van twee entiteiten die gelijk zijn binnen dezelfde transactie niet werkt. Zelfs als de tweede invoeging de juiste update zou veroorzaken, zou de em eindigen met 2 entiteitsinstanties die dezelfde databaserij vertegenwoordigen - wat niet is toegestaan.
Om dit op te lossen, hoeft u alleen maar ervoor te zorgen dat u geen 2 entiteiten invoegt die vanwege hun beperkingen gelijk worden weergegeven. (Ik gebruikte dezelfde logica voor equals/hashcode als de samengestelde-unieke-sleutel beperking, dus ik ben in staat om dergelijke duplicaten te elimineren bij het uitvoeren van batch-inserts)