Cómo reservar un conjunto de identificadores de clave principal para la precarga de datos de rutina de carga
Pregunta
Nos gustaría reservar un conjunto de identificadores de clave principal para todas las tablas (por ejemplo 1-1000) de manera que podamos arrancar el sistema con los datos del sistema de pre-cargados.
Todas las clases de entidad JPA tienen la siguiente definición de la clave primaria.
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
¿hay una manera de contar la base de datos que incrementos deberían empezar a suceder a partir de 1000 (es decir, los datos específicos del cliente se pondrá en marcha a partir de 1000 en adelante). Apoyamos (h2, mysql, postgres
) en nuestro entorno y que preferiría una solución que puede ser accionado a través de la APP y las herramientas de ingeniería inversa DDL a partir de hibernación.
Avísame si este es el enfoque correcto
Solución
Usted podría intentar la estrategia TABLE
en lugar de IDENTITY
. Del libro de hibernación:
Al igual que la estrategia
hilo
de Hibernate,TABLE
se basa en una tabla de base de datos que contiene el último generada número entero valor de clave primaria, y cada generador se asigna a una fila en esta tabla. Cada fila tiene dos columnas:pkColumnName
yvalueColumnName
. ElpkColumnValue
asigna a cada fila a un generador en particular, y la columna de valor tiene la última recuperado clave primaria. El proveedor de persistencia asigna números enteros hastaallocationSize
en cada turno.
Aquí es un ejemplo con más explicaciones. Y un más complejo para ajustar el valor inicial.
También podría tratar de usar un generador de secuencias de encargo, definido en su orm.xml
, como esto:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
Esto declara que una secuencia de base de datos llamada
MY_SEQUENCE
con un valor inicial de 123 puede ser utilizado como una fuente para la generación de identificador de base de datos, y que la persistencia motor debe obtener 20 valores cada vez que se necesita identificadores. (Nota, sin embargo, que Anotaciones de Hibernate, en el momento de la escritura, hace caso omiso de la configuracióninitialValue
.)Para aplicar este generador de identificador de una entidad en particular, utilice su nombre:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
Otros consejos
Si todo lo demás falla, siempre se puede escribir su propio generador de ID personalizado y utilizarlo en el método create(Entity entity)
de su DAO. La tabla de secuencia de identificación podría ser algo como
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
Esto podría significar que los ID de inicio de tabla foo
en 1001 y se incrementan en 100 (por lo que no tiene que llamar a DB para cada nueva inserción de la mesa).
Eso es lo que estamos utilizando sin muchos problemas.