Câu trả lời đúng sẽ là sử dụng câu lệnh sau:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
Tuy nhiên, vấn đề xuất hiện sau đó là chế độ ngủ đông không nhận được giá trị tự động tăng trở lại, sau khi câu lệnh cập nhật đã được thực hiện.
Tôi đã tìm thấy bài đăng trên blog sau ( http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) và sửa đổi truy vấn thành như sau:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
mà cuối cùng cũng hoạt động.
Một vấn đề nan giải với cách tiếp cận này là việc chèn hai thực thể bằng nhau trong cùng một giao dịch sẽ không hoạt động. Ngay cả khi lần chèn thứ hai sẽ gây ra cập nhật chính xác, thì kết thúc là 2 phiên bản thực thể đại diện cho cùng một hàng cơ sở dữ liệu - điều này không được phép.
Để giải quyết vấn đề này, người ta chỉ cần đảm bảo rằng bạn không chèn 2 thực thể được hiển thị bằng nhau do các ràng buộc của chúng. (Tôi đã sử dụng cùng một logic cho bằng / mã băm như ràng buộc khóa tổng hợp-duy nhất, vì vậy tôi có thể loại bỏ các bản sao như vậy khi thực hiện chèn hàng loạt)