sql >> Base de Datos >  >> RDS >> Mysql

Hibernate @SQLInsert y en clave duplicada

La respuesta correcta sería usar la siguiente declaración:

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

Sin embargo, aparece el problema de que Hibernate no recibió un valor de incremento automático una vez que se realizó la declaración de actualización.

Encontré la siguiente publicación de blog (http://www.jroller.com/mmatthews/entry/ obteniendo_hibernate_and_mysql_s ) y modifiqué la consulta a lo siguiente:

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

que finalmente funciona.

Un problema sin solución con este enfoque es que la inserción de dos entidades que son iguales dentro de la misma transacción no funciona. Incluso si la segunda inserción causara la actualización correcta, el em terminaría con 2 instancias de entidad que representan la misma fila de la base de datos, lo cual no está permitido.

Para resolver esto, solo hay que asegurarse de no insertar 2 entidades que se igualen debido a sus restricciones. (Utilicé la misma lógica para equals/hashcode que la restricción de clave única compuesta, por lo que puedo eliminar dichos duplicados al realizar inserciones por lotes)