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

Hibernate + ON lógica de CLAVE DUPLICADA

Hibernate puede lanzar una ConstraintViolationException cuando intenta insertar una fila que rompe una restricción (incluida una restricción única). Si no obtiene esa excepción, puede obtener alguna otra excepción general de Hibernate:depende de la versión de Hibernate y de la capacidad de Hibernate para asignar la excepción de MySQL a una excepción de Hibernate en la versión y el tipo de base de datos que está utilizando ( No lo he probado en todo).

Solo obtendrá la excepción después de llamar a flush() , por lo que debe asegurarse de que esto también esté en su bloque try-catch.

Tendría cuidado de implementar soluciones en las que compruebe que la fila existe primero. Si varias sesiones están actualizando la tabla al mismo tiempo, podría obtener una condición de carrera. Dos procesos leen la fila casi al mismo tiempo para ver si existe; ambos detectan que no está allí y luego ambos intentan crear una nueva fila. Uno fallará dependiendo de quién gane la carrera.

Una mejor solución es intentar la inserción primero y si falla, suponga que ya estaba allí. Sin embargo, una vez que tenga una excepción, tendrá que retroceder, lo que limitará la forma en que puede usar este enfoque.