Solución:
Para ser absolutamente claro … lo que describe no no entrar en conflicto con la especificación de alguna manera. La especificación habla de los valores que Hibernate asigna a sus entidades, no de los valores realmente almacenados en la secuencia de la base de datos.
Sin embargo, existe la opción de obtener el comportamiento que busca. Primero vea mi respuesta en ¿Hay alguna manera de elegir dinámicamente una estrategia @GeneratedValue usando anotaciones JPA e Hibernate? Eso te dará lo básico. Siempre que esté configurado para usar ese SequenceStyleGenerator, Hibernate interpretará allocationSize
utilizando el “optimizador agrupado” en SequenceStyleGenerator. El “optimizador agrupado” se utiliza con bases de datos que permiten una opción de “incremento” en la creación de secuencias (no todas las bases de datos que admiten secuencias admiten un incremento). De todos modos, lea sobre las diversas estrategias de optimización que existen.
allocationSize=1
Es una micro optimización antes de obtener la consulta. Hibernate intenta asignar un valor en el rango de tamaño de asignación y, por lo tanto, trata de evitar consultar la base de datos para la secuencia. Pero esta consulta se ejecutará cada vez que la establezca en 1. Esto apenas hace ninguna diferencia, ya que si alguna otra aplicación accede a su base de datos, se generarán problemas si, mientras tanto, otra aplicación utiliza la misma identificación.
La próxima generación de Sequence Id se basa en deploymentSize.
Por defualt se mantiene como 50
que es demasiado. También será de ayuda sólo si va a tener cerca 50
registros en una sesión que no se conservan y que se conservarán utilizando esta sesión y transacción en particular.
Entonces siempre deberías usar allocationSize=1
durante el uso SequenceGenerator
. Como para la mayoría de las bases de datos subyacentes, la secuencia siempre se incrementa en 1
.