Vous pourrez peut-être utiliser le générateur "guid". Voir ce post du forum Hibernate. Il semble qu'ils aient ajouté la prise en charge d'Oracle en utilisant SYS_GUID()
il y a quelque temps, mais la documentation indique toujours qu'ils ne prennent en charge que SQL Server et MySQL.
Je n'ai pas encore travaillé avec les annotations JPA, mais voici un exemple utilisant la configuration XML :
<id name="PRODUCT_ID">
<generator class="guid" />
</id>
MODIF : En ce qui concerne votre deuxième question, je pense que vous vous demandez pourquoi Hibernate ne peut pas faire quelque chose comme ça :
INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */
La raison en est qu'Hibernate doit connaître l'ID de l'objet. Par exemple, considérez le scénario suivant :
- Vous créez un nouvel objet Product et l'enregistrez. Oracle attribue l'ID.
- Vous détachez le produit de la session d'hibernation.
- Vous le rattachez plus tard et apportez quelques modifications.
- Vous souhaitez maintenant conserver ces modifications.
Sans connaître l'ID, Hibernate ne peut pas le faire. Il a besoin de l'ID pour émettre l'instruction UPDATE. Ainsi, l'implémentation de org.hibernate.id.GUIDGenerator
doit générer l'ID au préalable, puis le réutiliser ultérieurement dans l'instruction INSERT.
C'est la même raison pour laquelle Hibernate ne peut pas faire de traitement par lots si vous utilisez un ID généré par la base de données (y compris l'incrémentation automatique sur les bases de données qui le prennent en charge). L'utilisation de l'un des générateurs hilo, ou d'un autre mécanisme d'identification généré par Hibernate, est le seul moyen d'obtenir de bonnes performances lors de l'insertion simultanée de nombreux objets.