Cómo reservar un conjunto de identificadores de clave principal para la precarga de datos de rutina de carga

StackOverflow https://stackoverflow.com/questions/2606182

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

¿Fue útil?

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   y valueColumnName. El pkColumnValue 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 hasta allocationSize   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ón initialValue.)

     

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top