Rätt svar skulle vara att använda följande påstående:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Men då verkar problemet att viloläge inte fick tillbaka ett automatiskt ökningsvärde, när uppdateringssatsen har utförts.
Jag hittade följande blogginlägg (http://www.jroller.com/mmatthews/entry/ få_hibernate_and_mysql_s ) och ändrade frågan till följande:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
som äntligen fungerar.
Ett olösligt problem med detta tillvägagångssätt är att införandet av två enheter som är lika inom samma transaktion inte fungerar. Även om den andra infogningen skulle orsaka korrekt uppdatering, skulle em:en sluta med 2 entitetsinstanser som representerar samma databasrad - vilket inte är tillåtet.
För att lösa detta behöver man bara se till att du inte infogar 2 enheter som renderas lika på grund av deras begränsningar. (Jag använde samma logik för equals/hashcode som begränsningen sammansatt-unik-nyckel, så jag kan eliminera sådana dubbletter när jag utför batch-infogningar)