Möglicherweise können Sie den "guid" -Generator verwenden. Siehe diesen Beitrag aus dem Hibernate-Forum. Es sieht so aus, als hätten sie mit SYS_GUID()
Unterstützung für Oracle hinzugefügt eine Weile her, aber die Dokumentation sagt immer noch, dass sie nur SQL Server und MySQL unterstützen.
Ich habe noch nicht mit JPA-Anmerkungen gearbeitet, aber hier ist ein Beispiel mit XML-Konfiguration:
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
BEARBEITEN: In Bezug auf Ihre zweite Frage fragen Sie sich, warum Hibernate so etwas nicht kann:
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
Der Grund dafür ist, dass Hibernate die ID des Objekts kennen muss. Stellen Sie sich beispielsweise das folgende Szenario vor:
- Sie erstellen ein neues Produktobjekt und speichern es. Oracle vergibt die ID.
- Sie trennen das Produkt von der Hibernate-Sitzung.
- Sie hängen es später wieder an und nehmen einige Änderungen vor.
- Sie möchten diese Änderungen jetzt beibehalten.
Ohne die ID zu kennen, kann Hibernate dies nicht tun. Es benötigt die ID, um die UPDATE-Anweisung abzusetzen. Also die Implementierung von org.hibernate.id.GUIDGenerator
muss die ID vorher generieren und später in der INSERT-Anweisung wiederverwenden.
Aus dem gleichen Grund kann Hibernate kein Batching durchführen wenn Sie eine von der Datenbank generierte ID verwenden (einschließlich automatischer Inkrementierung bei Datenbanken, die dies unterstützen). Die Verwendung eines der Hilo-Generatoren oder eines anderen von Hibernate generierten ID-Mechanismus ist der einzige Weg, um eine gute Leistung beim gleichzeitigen Einfügen vieler Objekte zu erzielen.