Tengo una clase con la siguiente definición:
@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;
Cuando nos encontramos en Jboss 4.2.3 funcionó bien y generó la IDENTIFICACIÓN correcta (a partir de 1000+)
Ahora nos mudamos a jboss 7.1.1 y genera negativo ID! (a partir de -498 y subiendo)
Alguna idea de por qué puede suceder?
- ¿has comprobado lo que es la corriente de secuencia en Oracle y seguimiento de hibernación de salida, si usted ve adecuado seleccione siguiente secuencia consulta y si de copiar y pegar en sqlplus correcta/la misma/resultado esperado?
Sólo me encontré con este problema al migrar de JBoss 6.1 a JBoss 7.1.
De acuerdo a la JBoss as 7.1 JPA documentación ( https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-Persistenceunitproperties),
JBoss 7.1 establece automáticamente varias propiedades de hibernate. Una de las propiedades que se establece es
hibernate.id.new_generator_mappings
que activa la nueva IDENTIFICACIÓN de los generadores que utilizan diferentes algoritmos y no son compatibles. Al establecer esta propiedad en false en el persistence.xml archivo de restaurar el viejo de IDENTIFICACIÓN de generador de comportamiento.La hibernación 4 documentación también tiene información acerca de la nueva IDENTIFICACIÓN de los generadores: http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html_single/#mapping-declaration-id-generator.
La documentación de hibernate establece claramente que el nuevo ID de los generadores no están habilitadas por defecto, pero, como se señaló anteriormente, JBoss 7.1 automáticamente la habilitación de ellos.
hibernate.id.new_generator_mappings
valores predeterminados de las propiedades atrue
. Consulte docs.jboss.org/hibernate/orm/5.2/userguide/html_single/…El nuevo comportamiento es el siguiente:
AllocationSize es un rango de valores de clave principal reservada para Hibernar.
Y la seleccione
seq.nextval
de doble sólo se hará después de la hibernación consumido esta gama de claves primarias.Para que debe declarar el mismo valor en ambos
allocationSize
(Hibernate) y la secuenciaincrement by
(DB)Cuando se establece explícitamente
allocationSize=500
, por ejemplo, en OracleDe lo contrario, te darás cuenta de valores negativos o restricción de los errores generados a partir de su DB debido a la clave principal de las colisiones.
Cuando el servidor de la aplicación se reinicia, te darás cuenta de que el «salto» entre la última clave primaria asignada, y el ‘recién’ número de secuencia seleccionada en reiniciar.
Comentario Final: el valor por defecto es de 50. Así que si usted no especifica
allocationSize
en la Hibernación lado, usted debe declararincrement by
50 sobre la base de datos secundarios.Configuración
hibernate.id.new_generator_mappings
afalse
en mipersistence.xml
fue sólo la primera parte de la solución a mi problema:Para resolver por completo el problema que he añadido la
allocationSize
a1
en el@SequenceGenerator
(que estaba omitiendo).