sql >> Database >  >> RDS >> Oracle

Slaapstand configureren om Oracle's SYS_GUID() voor primaire sleutel te gebruiken

Mogelijk kunt u de "guid" -generator gebruiken. Zie dit bericht van het Hibernate-forum. Het lijkt erop dat ze ondersteuning voor Oracle hebben toegevoegd met behulp van SYS_GUID() een tijdje terug, maar de documentatie zegt nog steeds dat ze alleen SQL Server en MySQL ondersteunen.

Ik heb nog niet met JPA-annotaties gewerkt, maar hier is een voorbeeld met XML-configuratie:

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

BEWERKEN: Met betrekking tot je tweede vraag, denk ik dat je vraagt ​​waarom Hibernate zoiets niet kan doen:

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

De reden is dat Hibernate moet weten wat de ID van het object is. Denk bijvoorbeeld aan het volgende scenario:

  1. U maakt een nieuw Product-object en slaat het op. Oracle wijst de ID toe.
  2. U koppelt het product los van de sluimerstand.
  3. U voegt het later opnieuw toe en brengt enkele wijzigingen aan.
  4. U wilt deze wijzigingen nu behouden.

Zonder de ID te kennen, kan Hibernate dit niet doen. Het heeft de ID nodig om de UPDATE-verklaring af te geven. Dus de implementatie van org.hibernate.id.GUIDGenerator moet eerst de ID genereren en deze later opnieuw gebruiken in de INSERT-instructie.

Dit is dezelfde reden waarom Hibernate geen batches kan doen als u een door de database gegenereerde ID gebruikt (inclusief automatische verhoging van databases die dit ondersteunen). Het gebruik van een van de hilo-generatoren, of een ander door Hibernate gegenereerd ID-mechanisme, is de enige manier om goede prestaties te krijgen bij het invoegen van veel objecten tegelijk.



  1. SQL Server BCP export beschadigd bestand?

  2. Wat is de database, waarom database?

  3. Kan pg gem niet installeren op Windows

  4. Hoe voeg ik een tekenreeks toe met een automatische verhogingswaarde in SQL Server?