Du kan muligvis bruge "guide"-generatoren. Se dette indlæg fra Hibernate-forummet. Det ser ud til, at de tilføjede understøttelse af Oracle ved hjælp af SYS_GUID()
et stykke tid tilbage, men dokumentationen siger stadig, at de kun understøtter SQL Server og MySQL.
Jeg har ikke arbejdet med JPA-annoteringer endnu, men her er et eksempel ved hjælp af XML-konfiguration:
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
EDIT: Med hensyn til dit andet spørgsmål, tror jeg, du spørger, hvorfor Hibernate ikke kan gøre noget som dette:
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
Årsagen er, at Hibernate skal vide, hvad objektets ID er. Overvej f.eks. følgende scenarie:
- Du opretter et nyt produktobjekt og gemmer det. Oracle tildeler ID'et.
- Du afbryder produktet fra dvale-sessionen.
- Du vedhæfter det senere igen og foretager nogle ændringer.
- Du vil nu bevare disse ændringer.
Uden at kende ID'et kan Hibernate ikke gøre dette. Den skal bruge ID'et for at kunne udstede UPDATE-erklæringen. Så implementeringen af org.hibernate.id.GUIDGenerator
skal generere ID'et på forhånd og senere genbruge det i INSERT-sætningen.
Dette er den samme grund til, at Hibernate ikke kan udføre nogle batching hvis du bruger et databasegenereret ID (inklusive automatisk stigning på databaser, der understøtter det). Brug af en af hilo-generatorerne eller en anden Hibernate-genereret ID-mekanisme er den eneste måde at opnå god ydeevne på, når man indsætter mange objekter på én gang.