2011-05-29 8 views
5

Tengo una tabla con una columna única, "token", impuesta por una restricción única en la base de datos. En un caso particular, necesito cambiar una fila existente para tener el mismo token que otra fila existente, cambiando la 2ª fila para tener un nuevo valor.Orden de control de actualizaciones en hibernación

Por lo tanto, decir que tengo:

Identificación; símbolo 0; 'AAA' 1; 'BBB'

quiero Identificación del 0 ('AAA') tenga lugar el token 'BBB' . Entonces necesito cambiar 'bbb' para que sea 'jfeisefjse', y luego puedo cambiar 'aaa' para que sea 'bbb'. Esto se puede hacer en postgres en una sola sesión de búsqueda.

He intentado hacer lo mismo en el código: en una transacción obtengo el token de la fila existente (fila 1), lo configuro como un valor aleatorio, actualizo la otra fila (fila 0) tener el token de la fila 1, luego me comprometo. Sin embargo, hibernate no respeta el orden en el que hice los commits. Parece que siempre ejecuta primero la declaración de actualización para la fila 0, y postgres se queja de que está violando una restricción de clave externa.

¿Cómo puedo hacer que hibernate haga esto? ¿O forzar un cierto orden de las declaraciones de actualización, o alguna otra forma de hacer esto?

Nota: Hacer esto en dos transacciones (una para codificar la fila 1, luego otra transacción para actualizar la fila 0) no es una opción.

Respuesta

5

Session.flush() obligará a hibernate a escribir cualquier SQL pendiente sin comprometer la transacción. Es un poco torpe, pero a veces necesitas obtener un poco menos de 'ORM' y hacer que las cosas funcionen :)

+0

Gracias, funciona. Eso es mejor de lo que tenía en mente como copia de seguridad: escriba el sql en bruto para hacerlo y hibernate ejecutar eso para hacer la actualización en el orden correcto. Gracias –

+1

Advertencia: hibernate ignorará flush() siempre que lo desee. No garantiza de ninguna manera, forma o forma que SQL se ejecutará cuando usted lo desee. –

Cuestiones relacionadas