Pregunta

Estoy usando una secuencia para guardar la instancia del objeto de dominio en mi base de datos Oracle.Tengo una secuencia para cada tabla de la base de datos.Cuando uso la función de guardar en Usuario o Recurso, por ejemplo, ¿creó un nuevo recurso en el primer intento pero el ID utilizado fue 70?la secuencia muestra el siguiente número adecuado: 42, ya que la identificación máxima en la tabla es 41.¿Por qué se usó id=70 para insertar el nuevo recurso?

Además, en el siguiente intento, todas las inserciones fallan con este error.

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into GRARESOURCE (decomm
issioned, disabled, criticality, resourceClass, resourceGroupId, resourceName, ownerId, resourceSegmentId, resourceTypeId, riskSco
re, targetIP, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [GRA.SYS_C0012183]; nested exception is org.hibernate.e
xception.ConstraintViolationException: Could not execute JDBC batch update

No estoy seguro de qué está mal porque esto sucede después de la reestructuración del código... donde movimos el código a nuevos paquetes...

Editar:Descubrí la causa, vean mi respuesta... Gracias chicos.

¿Fue útil?

Solución 4

Me di cuenta de la causa principal del problema. Anteriormente, había usado el SecuenciaPertableAReclyLect, obtuve eso de una de las publicaciones anteriores de Burt Beckwith. El dialecto crea una nueva secuencia para cada tabla cuando la aplicación está iniciando, similar a la clase de dominio convertida en la tabla. El dialecto también se asegura de que cada secuencia de identificación de las tablas se administra solo a través de su secuencia y una secuencia común no se utiliza para todas las inserciones en la base de datos (que es la estrategia predeterminada) Durante la reestructuración del código, había eliminado el dialecto personalizado y estaba usando el dialecto 10G predeterminado.

eso es lo que estaba causando el problema!

Veo el siguiente número en el campo Siguiente Valor de la secuencia asociada de las tablas, que donde llego a saber que el próximo Val= 42 para recursos de recursos, que es el derecho, ya que MAX (ID) en la tabla de recursos es 41.

¡Muchas gracias a muchos chicos para la perspectiva que, de alguna manera, ayúdame a recordar la causa real! Para aquellos que necesitan saber más sobre el dialecto personalizado, es aquí

Otros consejos

Las secuencias pueden desperdiciar números, es decir, cada registro en una tabla no será necesariamente uno después de la siguiente sin brechas.En otras palabras, el hecho de que el suyo saltara a 70 a pesar de que el registro anterior de DB tuvo ID= 41 no indica un problema.

Dado que la identificación máxima en la tabla es 41

Las secuencias no ven el valor máximo de la tabla y obtén la siguiente.Almacenan el número secuencial actual y utilizará el siguiente valor.

Puede verificar el número real con:

select mysequence.currval from dual

Su problema es con la restricción de GRA.SYS_C0012183.Vea cómo esto comprueba, y si esta es su clave principal, tal vez puede usar un nombre más legible, como my_table_pk ...

Es SYS_C0012183 ¿La restricción de clave principal?¿Se define no solo el id columna (que es, supongo, la columna poblada por la secuencia)?

  • ¿Cómo se determina que el siguiente valor de la secuencia es 42?¿Está ejecutando una consulta separada para eso?
  • ¿Espera que la secuencia le proporcione números sin espacios?Si es así, eso es un problema con tus expectativas.Las secuencias devuelven valores distintos, pero no garantizan que no habrá espacios (de hecho, se puede garantizar que habrá espacios porque la base de datos se cerró, la secuencia se eliminó del grupo compartido o se revirtió una transacción).
  • ¿Cómo se utiliza la secuencia?¿Hay un disparador sobre la mesa?¿O Hibernate está configurado para usar la secuencia?Si Hibernate está configurado para usar la secuencia, publique esa configuración.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top