Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hibernate @SQLInsert und On Duplicate Key

Die richtige Antwort wäre die Verwendung der folgenden Anweisung:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

Allerdings tritt dann das Problem auf, dass Hibernate keinen Auto-Increment-Wert zurückerhalten hat, nachdem die Update-Anweisung ausgeführt wurde.

Ich habe den folgenden Blogbeitrag gefunden (http://www.jroller.com/mmatthews/entry/ getting_hibernate_and_mysql_s ) und änderte die Abfrage wie folgt:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);

was endlich funktioniert.

Ein unlösbares Problem bei diesem Ansatz ist, dass das Einfügen zweier gleicher Entitäten innerhalb derselben Transaktion nicht funktioniert. Selbst wenn die zweite Einfügung die korrekte Aktualisierung verursachen würde, würde das em mit 2 Entitätsinstanzen enden, die dieselbe Datenbankzeile darstellen - was nicht zulässig ist.

Um dies zu lösen, müssen Sie nur sicherstellen, dass Sie nicht 2 Entitäten einfügen, die aufgrund ihrer Einschränkungen gleich gerendert werden. (Ich habe dieselbe Logik für Equals/Hashcode wie die Composite-Unique-Key-Einschränkung verwendet, sodass ich solche Duplikate bei der Durchführung von Batch-Einfügungen eliminieren kann)