2009-08-21 10 views
1

J'ai une classe comme ça (avec des accesseurs, tous mis en correspondance avec mise en veille prolongée, chacun avec une séquence à Oracle DB)Hibernate enregistrer pour obtenir des séquences une seconde fois

public class A{ 
     private B b; 
     private C c; 
} 

Je crée cet objet et l'enregistrer dans la base de données.

Alors je crée un objet et un remplissiez avec un objet B et appelez

saveOrUpdate(a) 

afin que je puisse avoir « une » séquences et « b » générés. Ensuite, je fais quelques calculs et crée une instance de "C" et le mettre à "un"

Jusqu'à ici, tout fonctionne très bien. J'ai maintenant besoin d'obtenir l'identifiant de "c" pour que je fasse des vérifications avant que j'éclate et que je commette.

Mais saveOrUpdate ne fonctionnera pas ici car l'objet n'est plus transitoire. Selon Hibernate docs sur saveOrUpdate: "si l'objet est déjà persistant dans cette session, ne rien faire"

Des idées?

(ne peut pas afficher le code parce qu'il est trop long et désordonné, mais il est essentiellement que)

Répondre

0

si C est une classe mappée de mise en veille prolongée et la propery est correctement mis en correspondance, que hiberner détecte que la propriété C a changé en l'enregistrera pour vous lorsque la session se vide ou que la transaction active est validée. Ensuite, il est possible d'obtenir l'identifiant de C après la validation.

Une autre approche consiste à appeler saveOrUpdate (c). Dans ce cas, c obtient un identifiant, de sorte que vous pouvez le récupérer.

Quelles vérifications faites-vous pour que vous ayez besoin de l'identifiant c?

+0

droite. mais j'ai besoin de l'identifiant de C avant de flush et de commettre. et appeler saveOrUpdate sur "a" une seconde fois ne fait rien parce que "a" a déjà été rendu persistant dans cette session, donc il ne vérifie même pas s'il a été changé (pas jusqu'à ce que je vide, ce que je ne peux pas faire). J'ai besoin de l'identifiant de c pour faire une URL avec cet identifiant dans la chaîne de requête et de le mettre dans un texte qui va dans un autre champ. –

+0

wll, que vous devez faire un appel saveOrUpdate (c), donc Hibernate va attribuer un identifiant, que vous pouvez utiliser pour votre champ de texte. si le champ est une propriété de c, il sera correctement conservé par hibernate. – Salandur

Questions connexes