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:
- U maakt een nieuw Product-object en slaat het op. Oracle wijst de ID toe.
- U koppelt het product los van de sluimerstand.
- U voegt het later opnieuw toe en brengt enkele wijzigingen aan.
- 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.