sql >> Base de Datos >  >> RDS >> Mysql

Superclase abstracta polimórfica @GeneratedValue sobre MySQL

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:

  1. 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.
  2. 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 datos GenerationType.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 de insert 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:

  1. Iniciar transacción de lectura optimista.
  2. SELECCIONE MAX(address_id) DE LAST_IDS
  3. almacene el máximo en una variable java, es decir:$OldID.
  4. $NewID =$OldID + 1. (+100 en bloqueo pesimista)
  5. ACTUALIZAR LAST_IDS SET address_id=$newID DONDE dirección_id=$oldID ?
  6. comprometer la transacción de lectura optimista.
  7. si la confirmación fue exitosa, almacene $newID a setID() en el HibernateBean que desea guardar.
  8. 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 .