Możesz być w stanie użyć generatora „przewodników”. Zobacz ten post z forum Hibernate. Wygląda na to, że dodali obsługę Oracle za pomocą SYS_GUID()
jakiś czas temu, ale dokumentacja nadal mówi, że obsługują tylko SQL Server i MySQL.
Nie pracowałem jeszcze z adnotacjami JPA, ale oto przykład z użyciem konfiguracji XML:
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
EDYTUJ: Jeśli chodzi o twoje drugie pytanie, myślę, że pytasz, dlaczego Hibernate nie może zrobić czegoś takiego:
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
Powodem jest to, że Hibernate musi wiedzieć, jaki jest identyfikator obiektu. Rozważmy na przykład następujący scenariusz:
- Tworzysz nowy obiekt produktu i zapisujesz go. Oracle przypisuje identyfikator.
- Odłączasz produkt od sesji hibernacji.
- Później załączasz go ponownie i wprowadzasz pewne zmiany.
- Teraz chcesz zachować te zmiany.
Bez znajomości identyfikatora Hibernate nie może tego zrobić. Potrzebuje identyfikatora, aby wystawić oświadczenie UPDATE. Tak więc implementacja org.hibernate.id.GUIDGenerator
musi wygenerować identyfikator wcześniej, a później ponownie użyć go w instrukcji INSERT.
Z tego samego powodu Hibernate nie może wykonywać żadnego przetwarzania wsadowego jeśli używasz identyfikatora generowanego przez bazę danych (w tym automatycznego przyrostu w bazach danych, które go obsługują). Korzystanie z jednego z generatorów hilo lub innego mechanizmu identyfikatorów generowanego przez Hibernate jest jedynym sposobem na uzyskanie dobrej wydajności podczas wstawiania wielu obiektów naraz.