2012-08-17 19 views
5

Se me ha encomendado la tarea de reiniciar una secuencia para muchas columnas seriales diferentes en una base de datos PostgreSQL. Normalmente, simplemente usaría:¿Cómo reiniciar las secuencias PostgreSQL manejadas por Hibernate?

ALTER SEQUENCE serial RESTART WITH 105; 

Sin embargo, parece que Hibernate se está utilizando para manejar las secuencias de la base de datos. Realmente no sé nada sobre Hibernate, pero tengo entendido que hibernate_sequence es una secuencia global para todas las tablas. ¿Es eso correcto?

Asumo que yo tendría que hacer lo siguiente, entonces:

ALTER SEQUENCE hibernate_sequence RESTART WITH 105; 

pero no estoy seguro de lo que será la consecuencia. Supongamos que tengo las tablas A, B, C y D. Cada una de esas tablas tiene una columna de ID de tipo serie. ¿La declaración SQL anterior en hibernate_sequence reiniciará la columna ID para TODAS las tablas?

Gracias!

Respuesta

4

En primer lugar, hay un problema subyacente aquí: estás tratando el valor de las secuencias como si tuvieran algún significado. Ver el final de la respuesta.

Ahora, con Hibernate, depende de cómo haya configurado el usuario las asignaciones. Una instancia de Hibernate bien configurada usará las mismas secuencias que todo lo demás.

Desafortunadamente, la mayoría de las asignaciones no son muy buenas, o mejor dicho, creo que el comportamiento predeterminado de Hibernate es horrible y siempre debe ser anulado. La secuencia predeterminada utilizada es de hecho compartida hibernate_sequence para todas las tablas. Sin embargo, es completamente posible tener algunas tablas usando sus propias secuencias, y otras tablas que usan el hibernate_sequence compartido, o tener todas las tablas usando sus propias secuencias.

Para habilitar una respuesta definitiva necesitaría publicar sus asignaciones.

Si la tabla (s) que desea cambiar la generación de ID están utilizando las secuencias correctas para sus tablas en sus asignaciones de Hibernate, puede seguir adelante y ALTER SEQUENCE esa secuencia. Si sus asignaciones se realizan a través de JPA, eso se hace con @SequenceGenerator y @GeneratedValue con GenerationType.SEQUENCE. Si se realiza a través de orm.xml, hbm.xml o las anotaciones de Hibernate anteriores, deberá consultar el manual. O bien, si Hibernate es el único cliente que escribe en el DB, mire las secuencias para ver si están subiendo usando SELECT * FROM sequence_name.

Si las asignaciones para la (s) tabla (s) de interés están utilizando la hibernate_sequence compartida, probablemente no pueda hacer lo que quiera sin arreglar las asignaciones de Hibernate. Debería cambiar las asignaciones para que la asignación de las tablas de interés use una secuencia diferente, luego `LOCK TABLE y establecer el punto de inicio para esas secuencias en la fila más grande actualmente en la tabla.

Secuencias: ¿Por qué necesidad de cambiar o reiniciar la secuencia? No debería importar, ya que una clave primaria sintética es solo un número sin sentido que se compara por igualdad con otros números sin sentido. ¿Cuál es el problema que estás tratando de resolver?

+0

Las asignaciones se realizan con JPA, por lo que, por ejemplo, todas las clases (que se asignan a la base de datos como tablas) tienen un "ID entero = -1" definido con la asignación como "@GeneratedValue (strategy = GenerationType .SECUENCIA)".Dado que solo hay una secuencia en la base de datos (hibernate_sequence), y dado que hay lagunas entre los valores de ID en todas las tablas, creo que es seguro asumir que la secuencia predeterminada se comparte entre todos, como lo mencionó. La secuencia debe reiniciarse para todas esas tablas debido a evitar algunos conflictos en una transferencia de base de datos. – littleK

+0

Gracias de nuevo por su ayuda, muy informativo. – littleK

+1

@littleK No hay problema. Espero que ayude un poco. Fusionando bases de datos ... um ... "diversión". Diversión especial Espero que hayas comprado montones y montones de ginebra. –

Cuestiones relacionadas