sql >> Base de Datos >  >> RDS >> Oracle

Configure Hibernate para usar SYS_GUID() de Oracle para la clave principal

Es posible que pueda usar el generador "guid". Vea esta publicación del foro de Hibernate. Parece que agregaron soporte para Oracle usando SYS_GUID() hace un tiempo, pero la documentación todavía dice que solo son compatibles con SQL Server y MySQL.

Todavía no he trabajado con anotaciones JPA, pero aquí hay un ejemplo usando la configuración XML:

<id name="PRODUCT_ID">
  <generator class="guid" />
</id>

EDITAR: Con respecto a su segunda pregunta, creo que está preguntando por qué Hibernate no puede hacer algo como esto:

INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */

La razón es que Hibernate debe saber cuál es la ID del objeto. Por ejemplo, considere el siguiente escenario:

  1. Usted crea un nuevo objeto Producto y lo guarda. Oracle asigna la ID.
  2. Separe el Producto de la sesión de Hibernate.
  3. Más tarde lo vuelve a adjuntar y realiza algunos cambios.
  4. Ahora desea conservar esos cambios.

Sin conocer la ID, Hibernate no puede hacer esto. Necesita el ID para emitir la instrucción UPDATE. Así que la implementación de org.hibernate.id.GUIDGenerator tiene que generar el ID de antemano y luego reutilizarlo en la instrucción INSERT.

Esta es la misma razón por la que Hibernate no puede hacer ningún procesamiento por lotes si usa una identificación generada por la base de datos (incluido el incremento automático en las bases de datos que lo admiten). El uso de uno de los generadores de hilo, o algún otro mecanismo de ID generado por Hibernate, es la única forma de obtener un buen rendimiento al insertar muchos objetos a la vez.