sql >> Databasteknik >  >> RDS >> Oracle

Konfigurera Hibernate för att använda Oracles SYS_GUID() för primärnyckel

Du kanske kan använda "guide"-generatorn. Se det här inlägget från Hibernate-forumet. Det verkar som att de lagt till stöd för Oracle med SYS_GUID() ett tag sedan, men dokumentationen säger fortfarande att de bara stöder SQL Server och MySQL.

Jag har inte arbetat med JPA-kommentarer än, men här är ett exempel med XML-konfiguration:

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

EDIT: När det gäller din andra fråga tror jag att du frågar varför Hibernate inte kan göra något så här:

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

Anledningen är att Hibernate måste veta vad objektets ID är. Tänk till exempel på följande scenario:

  1. Du skapar ett nytt produktobjekt och sparar det. Oracle tilldelar ID:t.
  2. Du kopplar bort produkten från Hibernate-sessionen.
  3. Du bifogar det senare igen och gör några ändringar.
  4. Nu vill du fortsätta med dessa ändringar.

Utan att känna till ID:t kan Hibernate inte göra detta. Den behöver ID:t för att utfärda UPDATE-satsen. Så implementeringen av org.hibernate.id.GUIDGenerator måste generera ID:t i förväg och sedan återanvända det i INSERT-satsen.

Detta är samma anledning till varför Hibernate inte kan göra någon batchning om du använder ett databasgenererat ID (inklusive automatisk ökning av databaser som stöder det). Att använda en av hilo-generatorerna, eller någon annan Hibernate-genererad ID-mekanism, är det enda sättet att få bra prestanda när man infogar många objekt samtidigt.



  1. Ansluter Snowflake DB &IRI Workbench

  2. Begäran inställd i Concurrent Manager

  3. SQL-fel:ORA-00942-tabell eller vy finns inte

  4. Hur man kör SQL Server 2017 &2019 samtidigt på en Mac