Може да успеете да използвате генератора "guid". Вижте тази публикация от форума за Hibernate. Изглежда, че са добавили поддръжка за Oracle с помощта на SYS_GUID()
преди известно време, но документацията все още казва, че поддържат само SQL Server и MySQL.
Все още не съм работил с анотации на JPA, но ето пример за използване на XML конфигурация:
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
РЕДАКТИРАНЕ: По отношение на втория ви въпрос, мисля, че питате защо Hibernate не може да направи нещо подобно:
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
Причината е, че Hibernate трябва да знае какъв е ID на обекта. Например, помислете за следния сценарий:
- Създавате нов обект Продукт и го запазвате. Oracle присвоява идентификатора.
- Откачвате продукта от сесията на хибернация.
- По-късно го прикачвате отново и правите някои промени.
- Сега искате да запазите тези промени.
Без да знае идентификатора, Hibernate не може да направи това. Той се нуждае от идентификатора, за да издаде изявлението UPDATE. Така че реализацията на org.hibernate.id.GUIDGenerator
трябва да генерира идентификатора предварително и след това да го използва повторно в оператора INSERT.
Това е същата причина, поради която Hibernate не може да извършва пакетиране ако използвате генериран от база данни идентификатор (включително автоматично увеличаване на бази данни, които го поддържат). Използването на един от hilo генераторите или друг механизъм за идентификация, генериран от Hibernate, е единственият начин да постигнете добра производителност при вмъкване на много обекти наведнъж.