-->
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.  [ 8 posts ] 
Author Message
 Post subject: Est-ce possible de faire.........
PostPosted: Thu Aug 04, 2005 1:29 pm 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Salut,

Voici mon problème:

J'ai les trois tables suivantes: Echantillon --> Test --> Resultat
donc lien entre Echantillon et Test et lien entre Test et Resultat

Les objets portent le meme nom ainsi que les trois fichiers xml.

Le probleme est le suivant: Les données doivent être insérées dans les trois tables utilisant la même session et la même save/update methode.

Le résultat que j'obtiens à date est insert dans la table Echantillon (OK), insert dans la table Test (encore OK) et update dans la table Resultat(PAS OK).

J'ai essayé différentes manières de mapper les tables entre elle mais tous ont donné le même résultat.

La base de donnée n'est pas une base de donnée relationnelle malheureusement. De plus je dois ajouter que j'ai également essayé avec une collection (hashset).

Est que quelqu'un peu m'aider??

Merci


Hibernate version:
Hivernate 2.1.7

Mapping documents:

CODE DU FICHIER ECHANTILLON.HBM.XML

<class name="Echantillon"
table="ECHANTILLON">
<id name="id"
type="java.lang.Long"
column="ECHANTILLON_ID"
unsaved-value="0">
<generator class="assigned" />
</id>

<one-to-one name="tests"
class="Test"
cascade="save-update" />

CODE DU FICHIER TEST.HBM.XML
<one-to-one name="resultat"
class="Resultat"
cascade="save-update" />


Name and version of the database you are using:
Oracle9


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 2:57 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Que veux tu dire quand tu dis que ta base n'est pas relationnelle ? Oracle est relationnel.

Sinon il faudrait les trois fichiers de mapping entier pour comprendre.

Seb

PS : peux tu mettre tes fichiers de mapping dans des balises code, c'est plus facile à lire


Top
 Profile  
 
 Post subject: Est-ce possible de faire......
PostPosted: Fri Aug 05, 2005 9:33 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
Désolé, je croyais que l'explication était suffisamment claire. Voici en partie les trois fichiers xml qui sert de lien entre elle.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping >

<class name="Echantillon"
table="ECHANTILLONS">
<!-- NOTE: id is mapped 2x, also to property ORIGINAL_SAMPLE below -->
<id name="id"
type="java.lang.Long"
column="SAMPLE_NUMBER"
unsaved-value="0">
<generator class="assigned" />
</id>

<one-to-one name="tests"
class="Test"
cascade="save-update" />
</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class name="Test"
table="TEST_TEST">

<id name="id"
type="java.lang.Long"
column="TEST_NUMBER"
unsaved-value="0">
<generator class="assigned"/>
</id>


<one-to-one name="resultats"
class="Resultat"
cascade="save-update" />
</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping
default-cascade="save-update">


<class name="Resultat" table="RESULTATS" >
<id name="id"
type="java.lang.Long"
column="RESULT_NUMBER">
<generator class="assigned" />
</id>


<property name="testNumber"
type="java.lang.Long"
column="TEST_NUMBER"/>


</class>

</hibernate-mapping>


Lorsque je sauve les informations contenu dans l'objet, j'obtien un insert suivit d'un insert suivie d'un update. Le dernier doit aussi etre un inser.

Oracle est un SGDB relationnel toutefois la base de donnée que l'on doit utiliser ne l'est pas donc pas de clé primaire ou de foreign key. L'intégrité référentielle est géré par l'application ce qui nous complique la vie.

Si d'autres information sont utiles juste à demander.

Merci


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 9:49 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Le fait de faire un update au lieu d'un insert est souvent lié à l'attribut unsaved-value de l'id. Sur tes fichiers de mapping, Echantillon et Test précisent unsaved-value=0 mais pas résultats. Si tu mets une valeur d'id par défaut à 0 dans résultats, hibernate va considérer qu'il s'agit d'une valeur d'id correcte et va faire un update

2 choix
- Tu mets ton id de résultats à null par défaut
- Tu précises unsaved-value="ta valeur de départ"


Top
 Profile  
 
 Post subject: Est-ce possible de faire......
PostPosted: Fri Aug 05, 2005 11:54 am 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
J'ai fait la correction et ajouté (unsaved-value="0">) comme spécifié mais j'obtien toujours un update alors que je veux un insert. Je ne peux pas updater ce qui n'existe pas......

Ce que j'essaie de faire est de sauvegarder un nouvelle information dans 3 tables lors d'une même transaction ( save()) ayant un mapping

Parent vers child dont child est lui-meme un parent vers un autre child.
Parent --> Child --> Autre Child.

Ton aide est très apprécié ::))

???????????


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 05, 2005 12:18 pm 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
La meilleure façon de comprendre ce qui se pase est de débugguer le code d'hibernate.
Quelle méthode utilises tu ? saveOrUpdate ou bien save ?
Si tu as mis unsaved-value=0, vérifie bien qu'au moment d'appeler hibernate l'instance de résultats a bien 0 comme valeur d'identifiant.


Top
 Profile  
 
 Post subject: Est-ce possible de faire........
PostPosted: Fri Aug 05, 2005 12:59 pm 
Beginner
Beginner

Joined: Fri Jan 07, 2005 2:47 pm
Posts: 45
J'utilise save(obj). Toutefois l'instance de resultat n'est jamais a zero puisqu'elle est crée lorsque l' id lui est assigné. L'object qui contient le resultat est créé après l'objet Echantillon et test. Je suis entrain de me demander si je ne devrais pas au niveau Java programmation encapsuler le tout pour ensuite le sauvegarder. Si Hibernate est capable de mapper Parent vers enfant vers sous-enfant alors le problème pourrait à la rigueur être dans mon code.

Je pars pour une semaine donc a mon retour je vais ré-étudié cette partie de code.

Merci énormément pour ton aide.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 4:00 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Je ne dis pas que l'instance de résultat doit être à zéro mais que la valeur de son id doit être égale à ce que tu as précisé dans unsaved-value.

Il faut bien comprendre l'importance de unsaved-value. Ce paramètre indique à hibernate la valeur que doit avoir l'id pour qu'il considère qu'il s'agit d'un nouvel objet. Si ton id à cette valeur, hibernate fera un insert sinon il fera un update


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 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.