IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

[Hibernate] Problème de sauvegarde


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut [Hibernate] Problème de sauvegarde
    Bonjour,
    Je ne suis pas sur que ce post a sa place dans ce forum...

    Bref, voila mon problème, (Je suis débutante)
    Je fais un exemple tous simple sous eclipse pour comprendre comment utiliser la base, j'utilise toute les doc possibles mais là j'ai une erreur que je ne comprends pas.

    J'ai créer un objet Person, avec un age, un nom, un parent, et une liste d'enfants.
    (parent et enfants sont des personnes).
    voila mon code XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
     
    <hibernate-mapping package="cma.core.element">
            <class name="cma.core.element.Person" table="PERSON" discriminator-value="P">
                    <id name="id" column="uid" type="long" unsaved-value="null">
                         <generator class="hilo"/>
                    </id>
                    <property  name="birthday" type="date"/>
    ...                
            <Component  name="parent" class="cma.core.element.Person" column="uid">
            </component>
     
            <list name="children" table= "PERSON">
                    <key column="uid"/>
    	<index column="uid"/>
    	<composite-element class="cma.core.element.Person">
    	</composite-element>
            </list>
         </class>
    </hibernate-mapping>
    et dans ce cas je ne voyais dans la base (via phpMyAdmin) que les types de base. children et parent n'apparaissaient pas.
    Je me suis dis qu'il y avait du mieux, mais je ne suis pas vraiment sur d'avoir compris le rôle de la balise Component.

    Voilà si qq'1 peut m'aider ...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut Complément d'informations....
    Voilà pour vérifier si le probleme venait de mes listes..
    j'ai seulement définit dans ma classe Personn : nom, age... que des types de base.
    Dans le fichier XML, j'ai aussi enlever les parties correspondantes, il ne reste plus que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     <class name="Person" table="PERSON" discriminator-value="P">
                    <id name="id" column="uid" type="long" unsaved-value="null">
                            <generator class="hilo"/>
                    </id>
                    <property  name="birthday" type="date"/>
                    <property  name="firstName" type="string"/>
                    <property  name="lastName" type="string"/>
                    <property  name="sex" type="int"/>
     
            </class>
    Et pourtant j'ai toujours la même erreur :
    Unknown entity: cma.core.element.Person

    Je n'y connais pas grand chose du tout, mais c'est comme si on lui demandait de sauvegarder personne dans une base aui ne contient pas de table permettant de stoker la personne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Person person = new Person(parent, firstName, lastName, calendar.getTime(), sex);
        savedOnDatabase(person);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
      private void savedOnDatabase(Object object) {
          Session session = HibernateUtil.currentSession();
          Transaction transaction = null;
          try {
            transaction = session.beginTransaction();
            session.save(object);
            transaction.commit();
            baseTextArea.append("L'objet a bien été sauvegardé !");
          } catch (HibernateException exception) {
            baseTextArea.append(exception.getLocalizedMessage());
            exception.printStackTrace();
          } finally {
            HibernateUtil.closeSession();
          }
      }
    et mes fichierx xml sont rajouté à ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      private void createConfiguration() throws HibernateException {
        configuration = new Configuration();
     
        // Fichier de configuration (fichier xml).
        configuration.configure(ParameterUI.createFile(ParameterUI.CONFIG_FILE));
        // Fichiers de mapping (fichier xml).
        configuration.addFile(ParameterUI.createFile(ParameterUI.FAMILY_HBM_FILE));
        configuration.addFile(ParameterUI.createFile(ParameterUI.PERSON_HBM_FILE));
      }
     
      /**
       * Crée les tables dans la base de données.
       */
      private void createTableInDatabase() throws HibernateException {
        new SchemaExport(configuration).create(false, true);
      }
    alors vraiment si quelqu'un voit le pb, ou si je ne suis pas sur le bon forums prévenez moi....

    merci d'avance

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    bonjour,

    il est évident que les tables doivent être créées en base pour qu'Hibernate puissent fonctionner.

    Dans ton source il y a une méthode qui crée les tables. Est tu sûre de l'appeler ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    createTableInDatabase()
    De plus il manque le lien entre la propriété de ton objet et la colonne en base

    par exemple :
    <property name="birthday" type="date"/>
    devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property  name="birthday" column="BIRTHDAY" type="date"/>

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    merci pour ta réponse, j'ai ajouté les colonnes pour chaque propriété.

    Par contre pour ma liste d'enfants, j'ai une erreur qui provient des index mais (ne connaissant pas trop la syntaxe) je ne trouve pas de solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <class name="Person" table="PERSON" discriminator-value="P">
                <id name="id" column="uid" type="long" unsaved-value="null">
                       <generator class="hilo"/>
                </id>
          <property  name="birthday" column="BIRTHDAY" type="date"/>
     
          <property  name="firstName" column="FIRST_NAME" type="string"/>
          <property  name="lastName" column="NAME" type="string"/>
          <property  name="sex" column="SEX" type="int"/>
     
          <many-to-one class="Person" name="parent" column="parent_uid">
          </many-to-one>
     
          <list name="children" table = "PERSON">
    	<key column="children_uid"/>
    	<index column="children2_uid"/>
    	<composite-element class="Person">
     	</composite-element> 
          </list>				
     </class>
    l'erreur est :
    Caused by: java.lang.RuntimeException: Problème de configuration : Foreign key (FK8C768F558E99DD8CERSON [children_uid])) must have same number of columns as the referenced primary key (PERSON [children_uid,children2_uid])
    at cma.core.database.HibernateUtil.<clinit>

    c'est surement qq chose de bete, mais je ne sais pas ce qu'est PRIMARY KEY donc... et je ne comprend pas pourquoi on définit Key column et index Column, à quoi cela sert...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    <key column/> précise la clef étrangère de ton élément Enfant (permettant d'identifier un et un seul enfant)

    <index column/> : les collections de type map et list peuvent être indexée (triées) ce champ précise la colonne à utiliser.

    En consequence dans ton fichier de mapping on devrait trouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <list name="children" table = "PERSON">
       <key column="uid"/>
       <index column="uid"/>
       <composite-element class="Person">
        </composite-element>
          </list>

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    désolé, mais à la base c'est ce que j'avais fais, mais j'avais cette erreur :
    Repeated column in mapping for collection: cma.core.element.Person.children column: uid at cma.core.database.HibernateUtil.<clinit>
    Je remet le code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <class name="Person" table="PERSON" discriminator-value="P">
              <id name="id" column="uid" type="long" unsaved-value="null">
                            <generator class="hilo"/>
              </id>
              <property  name="birthday" column="BIRTHDAY" type="date"/>
              <many-to-one class="Person" name="parent" column="parent_uid">
              </many-to-one>
               <list name="children" table = "PERSON">
    	<key column="uid"/>
    	<index column="uid"/>
    	<composite-element class="Person">
     	</composite-element> 
                </list>
            </class>

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    exact tu ne peux pas déclarer un élément composite comme étant du même type que l'élément contenant.

    tu peux essayer avec une collection un-vers-plusieurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <set name="children">
    <key column="uid"/>
    <one-to-many class="Person"/>
    </set>

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    je ne peux pas utilisé list avec one to many ?
    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <list name="children" table = "PERSON">
    	<key column="uid"/>
    	<index column="uid"/>
    	<one-to-many class="Person">
     	</one-to-many> 
    </list>
    Car moi dans mon code de la classe j'utilise des List, et dans mon véritable projet j'ai mis quasiment que des List, donc ca serai bien que mon mapping fonctionne aussi avec une liste, sinon je devrai changer toutes mes listes par des set et cela risque d'être long...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    apparemment j'ai réussi à sauvegarder mon object dans la base de données avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	<list name="children" table = "PERSON">
    	     <key column="uid"/>
    	     <index column="child_uid"/>
    	     <one-to-many class="Person"/>
     	</list>
    merci pour l'aide, je suis vraiment débutante, lol

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    Par contre quand je regarde avec le logiciel phpMyAdmin, j'ai toujours un warninig :

    Nom de la clé ------------| Type -------|Cardinalité--|--Champ
    PRIMARY-------------------PRIMARY-------1-------------uid
    FK8C768F5583F167CC----INDEX---------aucune-------uid
    FK8C768F5572A627DB----INDEX---------aucune-------uid
    FK8C768F55755F3AB7-----INDEX---------aucune-------parent_uid


    PRIMARY and INDEX keys should not both be set for column `uid`
    Plus d'un index de type INDEX existe pour la colonne `uid`

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    un set dans le fichier de mapping Hibernate n'oblige pas à l'utilisation de set dans les classes Java. de même qu'un map ou un bag.

    L'utilisation d'un élement list est beaucoup plus contraignant (il faut un index spécifique (colonne supplémentaire qui permet d'ordonner les éléments)).

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    Je dois être embetante, mais en fait à la base j'avais essayer en mettant un set au niveau du mapping, mais il y a une erreur :
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.LinkedList at org.hibernate.type.SetType.wrap(SetType.java:39)
    Je m'était dis que c'était à cause de set...
    Mais tu viens de me dire que c'était possible, seulement comment dans ce cas ne pas avoir d'erreur de cast ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    Un set ne doit donc pas marcher avec une list (une collection : oui)

    cela doit marcher avec un bag (je ne suis pas sur de la syntaxe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <bag name="children">
    <key column="uid"/>
    <one-to-many class="Person"/>
    </bag>

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    ok merci...
    En fait si je comprends bien....
    pour être sur de ce que je fais, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    <many-to-one class="cmatinier.core.element.Person" name="parent" column="parent_uid">
    	</many-to-one>
    	<bag name="children" table = "PERSON">
    		<key column="child_uid"/>
    		<one-to-many class="cmatinier.core.element.Person"/>
     	</bag>
    indique à la base de données qu'elle va stocker une personne qui est le parent, et une suite de Person les enfants.

    Si c'est bien ca, au niveau de l'affichage phpMyAdmin, je vais voir mes différentes colonnes, (name, bithday,.. parent_uid, child_uid) avec leur contenu, mais comme parent doit afficher des Person qui est un type personnaliser, moi je vois un entier mais je ne comprends pas ce qu'il est censé représenté, et ma liste de children est null alors qu'elle est censé contenir des personnes...
    Au niveau du code, tout marche mais dans la base ce n'est pas fait convenablement...
    est ce normale ?
    Pour info, si cela change quelque chose, mais list sont déclaré comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List list = new LinkedList()
    Le probleme vient peut etre de la ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    d'apres ton fichier de mapping

    une personne (Person) possède des attributs
    - birthday
    - firstName
    - lastName
    - sex

    Peut posseder un parent (un seul ?) lui même de type Person (relation many-to-one), une autre personne peut posseder le même parent.

    Peut posseder plusieurs enfants de type Person dont il est le seul à les posseder (relation one-to-many).

    La premiere question à se poser est : cela correspond il à ma modélisation ? La relation parent - personne est surement suffisante par exemple.

    Ensuite pour la traduction en base de données

    la relation many-to-one ajoute à ta table de base (Person) une colonne supplémentaire qui est un identifiant unique du Parent .
    par exemple soit un parent (donc une personne) avec comme identifiant unique 5 (champ id). Alors dans la colonne parent_uid de l'enfant on trouvera 5.

    La relation one-to-many est plus complexe puisqu'il faut utiliser une jointure (une personne peut posseder plusieurs enfants). Hibernate génére cette jointure automatiquemnt à partir de ton fichier de mapping
    , tu dois avoir cette table en base.

    Dans ton code tu ne valorise pas les enfants ce qui explique pourquoi le champ est nul en base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Person person = new Person(parent, firstName, lastName, calendar.getTime(), sex);
        savedOnDatabase(person);

    Hibernate gère les List (interface) et donc toute ces classes concrètes (ArrayList, LinkedList, etc..)

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    merci pour ce cours c beaucoup plus clair maintenant...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Hibernate/JPA 1 & CLOB pas sauvegardé en base
    Par jeeFan dans le forum JPA
    Réponses: 1
    Dernier message: 01/12/2010, 14h07
  2. Réponses: 3
    Dernier message: 07/12/2007, 11h35
  3. Réponses: 1
    Dernier message: 31/07/2007, 16h16
  4. [hibernate]pb sauvegarde collection
    Par riben dans le forum Hibernate
    Réponses: 2
    Dernier message: 07/06/2006, 16h52
  5. [Hibernate] problème de sauvegarde
    Par ultimax dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/12/2005, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo