-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: Heritage Database non mise à jour pour des objets existants
PostPosted: Sat Dec 03, 2005 5:49 am 
Newbie

Joined: Sat Dec 03, 2005 5:35 am
Posts: 11
Bonjour,

Après avoir parcouru la doc, je n'ai pas trouvé (ou pas compris) comment mettre à jour des objets hérités. Je m'explique :

B hérite de A
C hérite de A

Lorsque j'insère un objet dont la clé n'existe pas en base, cela fonctionne, j'ai une ligne dans la table A, une dans la table B (ou C suivant l'objet).
Je réalise cette opération en faisant un :
session.save(A)

Lorsque je récupère ces objets, pas de pb non plus : avec un select je récupère bien des objets de types B ou C

J'ai deux méthodes pour mettre à jour mes données :
DBModel.update(A)
A = DBModel.get(cle)

Bref, ca roule, sauf que ! Lorsque je veux mettre à jour un objet qui existe déjà en base : par exemple changer un objet de type B vers C (l'objet A dont héritait B reste le même pour C)
la méthode update ne modifie rien en base.

- dans la console SQL, j'ai bien une requête insert dans la table C et dans la table A, mais rien ne se passe (peut être à cause des contraintes de la base entre les tables A, B, C)
- quand j'essaye de faire un delete avant le save (pour nettoyer l'état en base) j'ai une exception, un objet avec identifiant existe déjà. (En effet :)
- peut être dois-je utiliser le load (à ce moment j'ai l'id unique de l'objet)
mais n'est-ce pas déjà fait par le select précédent ?

Pour résumé : un objet hérité qui est déjà en base n'est pas mis à jour lorsque le type hérité change

Avez-vous déjà rencontré ce cas ?
Vous faut-il plus d'information concernant les mappings, objet & autres ?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 4:41 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
"par exemple changer un objet de type B vers C"

désolé tu violes la définition d'héritage, il fallait employer la délégation (avec une association vers une classe Type par exemple).

Un objet ne peut pas changer de type... ce sont les bases de Java.

Donc si tu peux faire machine arriere, modifie ta conception, sinon tu vas devoir coder une verrue:
- delier les instances associées
- "cloner" manuellement pour changer de type --> tu dois mettre à null l'id
- effacer l'objet
- relier les associations vers ton clone
- le sauvegarder

Cela n'est pas toujours possible et c'est tres tres lourd et a terme tres couteux en maintenance.

Autre possibilité, si tu as la stratégie avec discriminateur, fais l'update du discriminant en JDBC, ça permettra de couvrir ton erreur de conception sans trop de dégats.

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject:
PostPosted: Mon Dec 05, 2005 6:35 pm 
Newbie

Joined: Sat Dec 03, 2005 5:35 am
Posts: 11
Rebonjour,

En effet, il y avait un pb :)
Donc maintenant l'objet B est détruit, un objet C est créé et tout roule.

Mon erreur lorsque j'ai tenté de faire cela la première fois était de croire hibernate "tout puissant" :)

Je m'explique, j'avais simplement recopié l'id de B dans C, et demandé à hibernate de sauvegarder C. A sa charge de retrouver dans les tables joined-subclass l'id correspondant, de le supprimer dans une et de l'insérer dans l'autre.

Bref, ceci est du passé, je détruit B, je sauve C, tout va mieux.

Merci pour tout.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.