La risposta corretta sarebbe usare la seguente affermazione:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Tuttavia, il problema sembra che l'ibernazione non abbia ricevuto un valore di incremento automatico, una volta eseguita l'istruzione di aggiornamento.
Ho trovato il seguente post sul blog (http://www.jroller.com/mmatthews/entry/ ottenere_ibernazione_e_mysql_s ) e ha modificato la query come segue:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
che finalmente funziona.
Un problema irrisolvibile con questo approccio è che l'inserimento di due entità uguali all'interno della stessa transazione non funziona. Anche se il secondo inserimento causerebbe l'aggiornamento corretto, l'em finirebbe con 2 istanze di entità che rappresentano la stessa riga del database, il che non è consentito.
Per risolvere questo problema, è sufficiente assicurarsi di non inserire 2 entità rese uguali a causa dei loro vincoli. (Ho usato la stessa logica per equals/hashcode del vincolo composite-unique-key, quindi sono in grado di eliminare tali duplicati durante l'esecuzione di batch-insert)