Oracle
 sql >> Database >  >> RDS >> Oracle

Configura Hibernate per utilizzare SYS_GUID() di Oracle per la chiave primaria

Potresti essere in grado di utilizzare il generatore "guid". Vedi questo post dal forum Hibernate. Sembra che abbiano aggiunto il supporto per Oracle utilizzando SYS_GUID() qualche tempo fa, ma la documentazione dice ancora che supportano solo SQL Server e MySQL.

Non ho ancora lavorato con le annotazioni JPA, ma ecco un esempio utilizzando la configurazione XML:

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

MODIFICA: Per quanto riguarda la tua seconda domanda, penso che tu stia chiedendo perché Hibernate non può fare qualcosa del genere:

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

Il motivo è che Hibernate deve sapere qual è l'ID dell'oggetto. Ad esempio, considera il seguente scenario:

  1. Crei un nuovo oggetto Prodotto e lo salvi. Oracle assegna l'ID.
  2. Stacchi il Prodotto dalla sessione di ibernazione.
  3. In seguito lo ricolleghi e apporti alcune modifiche.
  4. Ora vuoi mantenere tali modifiche.

Senza conoscere l'ID, Hibernate non può farlo. È necessario l'ID per emettere l'istruzione UPDATE. Quindi l'implementazione di org.hibernate.id.GUIDGenerator deve prima generare l'ID e poi riutilizzarlo nell'istruzione INSERT.

Questo è lo stesso motivo per cui Hibernate non può eseguire nessun batch se si utilizza un ID generato dal database (incluso l'incremento automatico nei database che lo supportano). L'uso di uno dei generatori di hilo, o di qualche altro meccanismo di ID generato da Hibernate, è l'unico modo per ottenere buone prestazioni quando si inseriscono molti oggetti contemporaneamente.