Poprawną odpowiedzią byłoby użycie następującego stwierdzenia:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Jednak pojawia się problem polegający na tym, że hibernacja nie otrzymała z powrotem wartości automatycznego przyrostu po wykonaniu instrukcji aktualizacji.
Znalazłem następujący post na blogu (http://www.jroller.com/mmatthews/entry/ uzyskiwanie_hibernacji_and_mysql_s ) i zmodyfikował zapytanie w następujący sposób:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
co w końcu działa.
Nierozwiązywalnym problemem związanym z tym podejściem jest to, że wstawienie dwóch równych podmiotów w ramach tej samej transakcji nie działa. Nawet jeśli drugie wstawienie spowodowałoby poprawną aktualizację, em zakończyłby się z 2 instancjami encji reprezentującymi ten sam wiersz bazy danych - co jest niedozwolone.
Aby rozwiązać ten problem, wystarczy upewnić się, że nie wstawiasz 2 jednostek, które są renderowane jako równe ze względu na ich ograniczenia. (Użyłem tej samej logiki dla równości/hashcode, co ograniczenie złożonego klucza unikalnego, więc jestem w stanie wyeliminować takie duplikaty podczas wykonywania wstawek wsadowych)