Možná budete moci použít generátor „guid“. Viz tento příspěvek z fóra Hibernate. Vypadá to, že přidali podporu pro Oracle pomocí SYS_GUID()
před časem, ale dokumentace stále říká, že podporují pouze SQL Server a MySQL.
S anotacemi JPA jsem ještě nepracoval, ale zde je příklad použití konfigurace XML:
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
UPRAVIT: Pokud jde o vaši druhou otázku, myslím, že se ptáte, proč Hibernate nemůže udělat něco takového:
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
Důvodem je, že Hibernate musí vědět, jaké je ID objektu. Zvažte například následující scénář:
- Vytvoříte nový objekt produktu a uložíte jej. Oracle přiřadí ID.
- Odpojíte produkt od relace Hibernate.
- Později jej znovu připojíte a provedete nějaké změny.
- Nyní chcete tyto změny zachovat.
Bez znalosti ID to Hibernate nemůže udělat. K vydání příkazu UPDATE potřebuje ID. Tedy implementace org.hibernate.id.GUIDGenerator
musí ID předem vygenerovat a později jej znovu použít v příkazu INSERT.
To je stejný důvod, proč Hibernate nemůže provádět žádné dávkování pokud používáte ID vygenerované databází (včetně automatického zvýšení u databází, které jej podporují). Jediným způsobem, jak dosáhnout dobrého výkonu při vkládání velkého množství objektů najednou, je použití jednoho z generátorů hilo nebo jiného mechanismu ID generovaného Hibernatem.