Det rigtige svar ville være at bruge følgende udsagn:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Men så ser problemet ud til, at dvale ikke modtog en automatisk stigningsværdi tilbage, når opdateringssætningen er blevet udført.
Jeg fandt følgende blogindlæg (http://www.jroller.com/mmatthews/entry/ få_dvale_og_mysql_s ) og ændrede forespørgslen til følgende:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
som endelig virker.
Et uløseligt problem med denne tilgang er, at indsættelsen af to enheder, der er ens inden for samme transaktion, ikke virker. Selvom den anden indsættelse ville forårsage den korrekte opdatering, ville em'en ende med 2 entity-instanser, der repræsenterer den samme databaserække - hvilket ikke er tilladt.
For at løse dette skal man bare sikre sig, at du ikke indsætter 2 entiteter, som er gengivet lige på grund af deres begrænsninger. (Jeg brugte den samme logik for equals/hashcode som den sammensatte-unik-nøgle-begrænsning, så jeg er i stand til at eliminere sådanne dubletter, når jeg udfører batch-indsættelser)