Configurer Hibernate pour utiliser Oracle SYS_GUID() pour la Clé Primaire
Je suis à la recherche d'un moyen d'obtenir d'hibernation pour l'utilisation d'oracle SYS_GUID()
fonction lors de l'insertion de nouvelles lignes. Actuellement ma DB tables ont SYS_GUID()
que la valeur par défaut donc si hibernate simplement SQL généré qui omis, la valeur, il devrait fonctionner.
J'ai tout qui fonctionne, mais il est actuellement en générant l'UUID/GUID dans le code en utilisant le système générateur d'uuid:
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "PRODUCT_ID", unique = true, nullable = false)
public String getId() {
return this.productId;
}
C'est très bien, mais je préférerais que les guid ont été générés par la base de données de sorte qu'ils seront séquentielle et potentiellement de meilleures performances. De Plus, je voudrais juste savoir comment configurer ce.
Je suis à l'aide d'annotations pour la configuration, mais de configuration xml exemples sont impressionnantes.
Voici un exemple de définition de la table (dans le cas où c'est important):
CREATE TABLE SCHEMA_NAME.PRODUCT
(
PRODUCT_ID RAW(16) DEFAULT SYS_GUID() NOT NULL,
PRODUCT_CODE VARCHAR2(10 CHAR) NOT NULL,
PRODUCT_NAME VARCHAR2(30 CHAR) NOT NULL,
PRODUCT_DESC VARCHAR2(512 CHAR)
)
Mise à JOUR:
Mat de la solution de l'aide "guid" a travaillé, voici le code sql généré:
Hibernate:
select rawtohex(sys_guid())
from dual
Hibernate:
insert into PRODUCT
(PRODUCT_CODE, PRODUCT_DESC, LOB_ID, PRODUCT_NAME, PROVIDER_ID, PRODUCT_ID)
values (?, ?, ?, ?, ?, ?)
Il semble que l'utilisation de colonnes par défaut de la valeur dans un insert n'est pas possible, de sorte que le choix est entre une application générée guid et une base de données de l'aller-retour.
OriginalL'auteur Ryan Cook | 2009-05-11
Vous devez vous connecter pour publier un commentaire.
Vous pourriez être en mesure d'utiliser la "guid" générateur. Voir ce post de la veille prolongée forum. On dirait qu'ils l'ajout du support pour Oracle à l'aide
SYS_GUID()
un moment en arrière, mais la la documentation toujours dit qu'ils prennent uniquement en charge SQL Server et MySQL.Je n'ai pas travaillé avec des annotations JPA encore, mais voici un exemple de configuration XML:
EDIT: En ce qui concerne votre deuxième question, je pense que vous vous demandez pourquoi Hibernate ne peut pas faire quelque chose comme ceci:
La raison en est que Hibernate doit savoir ce que l'IDENTIFIANT d'objet est. Par exemple, considérons le scénario suivant:
Sans connaître l'ID, Hibernate ne peut pas le faire. Il a besoin de l'ID dans le but de délivrer de l'instruction de mise à JOUR. Donc, la mise en œuvre de
org.hibernate.id.GUIDGenerator
a pour générer l'ID à l'avance, et puis plus tard, sur la ré-utiliser dans l'instruction INSERT.C'est la même raison pourquoi Hibernate ne peut pas faire tout le traitement par lots si vous utilisez une base de données générée (y compris l'auto-incrément sur les bases de données qui le prennent en charge). À l'aide de l'un des générateurs de hilo, ou certains autres Hibernate-ID généré mécanisme, est la seule façon d'obtenir de bonnes performances lors de l'insertion d'un grand nombre d'objets à la fois.
Salut Ryan. J'ai édité ma réponse pour tenter de répondre à votre question de suivi.
FYI: ce Faisant via l'annotation est simple: @GenericGenerator(name = "guid" stratégie = "guid")
Pour moi, j'ai dû donner deux annotatations @GeneratedValue(générateur=”db-guid”) @GenericGenerator(name=”db-guid” stratégie = “guid”)
OriginalL'auteur Matt Solnit
J'ai la même tâche que le sujet de démarreur. Grâce à @Matt Solnit suggestion, je utiliser ces annotations:
strategy = "guid"
etString
type sont des éléments essentiels de la solution.Avant la persistance de nouvelles entités Hibernate problème de requête SQL:
Ma configuration: Oracle 11, Hibernate 4.3.4.Final, Le Printemps 3.2.x. Et le champ est
raw(16)
dans le tableau pour le stockage efficace et moins la taille de l'index, puis, si vous utilisezchar(32)
.Lorsque j'essaie d'utiliser
java.util.UUID
comme ID type de champ j'obtiens l'erreur de mise en veille prolongée sur la persistance de la nouvelle entité (il essayer de mettreString
type dejava.util.UUID
champ).Aussi j'utilise
javax.xml.bind.DatatypeConverter
pour les non-Hibernate requêtes (Spring JDBC aides), pour le passage de convertirbyte[]
:pour l'extraction:
Tous les contrôleurs obtenir des codes comme:
sans
{
,-
,}
caractères (représentation habituelle de l'UUID est{a-b-c-d-x-y}
si vous vous souvenez). Cette représentation déjà le codage d'URL propre et sûr. Vous n'avez pas besoin de mettre en œuvrePropertyEditor
ouConvertor
pourString
type:Comparer avec l'échec de la tentative d'utilisation de
jaa.util.UUID
, où j'ai besoin d'écrire:pour l'utiliser:
OriginalL'auteur gavenkoa
Je pense que vous pouvez le faire en définissant le générateur natif. Je ne suis pas vraiment sûr de savoir comment faire en Hibernation, mais dans NHibernate vous feriez quelque chose comme ceci dans le fichier XML:
Au fait, vous avez précisé que vous faites cela dans NHibernate, mais n'a pas de spécifier la base de données et c'est la principale préoccupation important ici.
Il ya une très bonne chance que je me trompe, j'ai juste commencé à utiliser de NHibernate.
OriginalL'auteur cdmckay