Qué lío... AUTO_INCREMENT
es la secuencia oculta de MySQL. El problema radical es que MySQL
no puede insertar y devolver el PK al mismo tiempo, pero Hibernate lo necesita mientras INSERT
creando una nueva Entidad.
Los problemas con los que te encuentras:
- Si Hibernate guarda una nueva Entidad, intenta establecer la identificación de forma automática en el nuevo EntityBean. Por lo tanto, hibernate debe leer qué ID usará la base de datos antes de que hibernate guarde la nueva tupla en la tabla.
- Si tiene varios servidores que acceden a la base de datos, debe dejar que la fábrica de sesiones de hibernate decida usar la secuencia integrada (AUTO-INCREMENT) o dejar que hibernate decida (
GenerationType.AUTO
/GenerationType.IDENTITY
) qué tan grande es el rango abierto de PK reservados (trabajo de un DB-Architect). (Tenemos alrededor de 20 servidores en una base de datos, por lo que en una tabla bien utilizada usamos una distancia PK de +100). Si solo un servidor tiene acceso a la base de datosGenerationType.TABLE
será correcto.
Hibernate debe calcular la próxima identificación usted mismo usando max(*)+1
pero:
- ¿Qué pasa si dos solicitudes piden
max(*)+1
al mismo tiempo/con el mismo resultado? Derecha:El último intento deinsert
fallará.
Por lo tanto, debe tener una tabla LAST_IDS
en la base de datos que almacena la última Tabla-PK. Si desea agregar uno, debe seguir estos pasos:
- Iniciar transacción de lectura optimista.
- SELECCIONE MAX(address_id) DE LAST_IDS
- almacene el máximo en una variable java, es decir:$OldID.
- $NewID =$OldID + 1. (+100 en bloqueo pesimista)
- ACTUALIZAR LAST_IDS SET address_id=
$newID
DONDE dirección_id=$oldID
? - comprometer la transacción de lectura optimista.
- si la confirmación fue exitosa, almacene
$newID
asetID()
en el HibernateBean que desea guardar. - Finalmente, deje que Hibernate llame a la inserción.
Esta es la única forma que conozco.
Por cierto:Hibernate-Entitys solo usará herencia si la base de datos admite herencia entre tablas como PostgreSQL
o Oracle
.