Правилният отговор би бил да се използва следното твърдение:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Тогава обаче проблемът изглежда, че hibernate не е получил обратно стойност за автоматично увеличение, след като операторът за актуализиране е изпълнен.
Намерих следната публикация в блога (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) и модифицира заявката на следното:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
което най-накрая работи.
Неразрешим проблем с този подход е, че вмъкването на две единици, които са равни в рамките на една и съща транзакция, не работи. Дори ако второто вмъкване би причинило правилната актуализация, em ще завърши с 2 екземпляра на обекта, представляващи един и същ ред на базата данни - което не е разрешено.
За да разрешите това, просто трябва да се уверите, че не вмъквате 2 субекта, които се изравняват поради техните ограничения. (Използвах същата логика за equals/hashcode като ограничението за съставен уникален ключ, така че мога да премахна такива дубликати при извършване на пакетни вмъквания)