Jawaban yang benar adalah dengan menggunakan pernyataan berikut:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Namun kemudian muncul masalah bahwa hibernasi tidak menerima nilai kenaikan otomatis kembali, setelah pernyataan pembaruan dilakukan.
Saya menemukan posting blog berikut (http://www.jroller.com/mmatthews/entry/ mendapatkan_hibernate_and_mysql_s ) dan memodifikasi kueri menjadi berikut:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
yang akhirnya berhasil.
Masalah yang tak terpecahkan dengan pendekatan ini adalah, bahwa penyisipan dua entitas yang sama dalam transaksi yang sama tidak bekerja. Bahkan jika penyisipan kedua akan menyebabkan pembaruan yang benar, mereka akan berakhir dengan 2 entitas-instance yang mewakili baris database yang sama - yang tidak diperbolehkan.
Untuk mengatasi ini, Anda hanya perlu memastikan bahwa Anda tidak memasukkan 2 entitas yang dirender sama karena batasannya. (Saya menggunakan logika yang sama untuk equals/hashcode sebagai batasan composite-unique-key, jadi saya dapat menghilangkan duplikat seperti itu saat melakukan penyisipan batch)