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] Chargement d'objet incorrect


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Par défaut [HIBERNATE] Chargement d'objet incorrect
    Bonjour, j'ai un problème de récupération d'objets persistants dans Hibernate.

    Je possède 3 tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    events {events_id,title,...}
    person {person_id,age,...}
    person_event {person_id,event_id}
    mappées comme suit :

    (Classe Person)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <hibernate-mapping>
        <class name="events.Person" table="person" schema="public">
            <id name="personId" type="long">
                <column name="person_id" />
                <generator class="increment" />
            </id>
            ...
            <set name="events" table="PERSON_EVENT">
                <key column="PERSON_ID"/>
                <many-to-many column="EVENT_ID" class="events.Events"/>
            </set>
        </class>
    </hibernate-mapping>
    (Classe Events)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <hibernate-mapping>
        <class name="events.Events" table="events" schema="public">
            <id name="eventsId" type="long">
                <column name="events_id" />
                <generator class="increment" />
            </id>
            ...
            <set name="personnes" table="PERSON_EVENT">
                <key column="EVENT_ID"/>
                <many-to-many column="PERSON_ID" class="events.Person"/>
            </set>
        </class>
    </hibernate-mapping>
    Le mapping fonctionne parfaitement, les insertions et suppressions ne posent pas de problèmes.
    Par contre lorsque j'essaye de récupérer une instance de ma classe Person :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    this.model.setDatas(session.createQuery("from Person").list());
    this.personne = (Person) model.getDatas().get(0);
    session.getTransaction().commit();
    Il remplit apparemment la propriété events de la classe avec des objets de type PersistentSet car je reçois l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: javax.servlet.jsp.JspException: Error getting property 'eventsId' from bean of type org.hibernate.collection.PersistentSet
    L'erreur à lieu lorsque ma JSF tente d'accéder aux évènements contenus dans l'instance de Person:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <h:dataTable binding="#{personctrl.view.dataTable}"
                value="#{personctrl.personne.events}" var="ev" border="1">
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Identifiant" />
                    </f:facet>
                    <h:outputText value="#{ev.eventsId}" />
                </h:column>
                ...
    J'espère avoir été suffisament précis ... merci de votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Par défaut
    Hum ... j'ai mal expliqué mon problème ou personne n'a une idée de la solution ?? Je précise que si j'essaye un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("TYPE : " + ((Events)(this.personne.getEvents().iterator().next())).getEventsId());
    Je lève une exception du type LazyInitializationException ce qui d'après la doc d'hibernate correspond à une erreur d'initialisation de proxy. Je pense que c'est mon mapping many-to-many qui n'est pas bon mais je ne vois toujours pas ou se trouve le problème ... help !

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Par défaut
    Dans la version 3 d'Hibernate toutes les collections sont dites "paresseuses"

    Hibernate ne cherchera pas à peupler directement les collections dépendantes à la récupération de l'objet (ici lorsqu'il récupère une personne, il ne récupère pas les evenements associés).


    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <set name="events" table="PERSON_EVENT" lazy = "false">

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Par défaut
    Je m'apprêtais à avaler une capsule de cyanure ...
    Effectivement j'ai lu ça dans la doc mais il y est écrit que lazy est false par défaut, je n'ai pas pris la peine de le mettre ... mea culpa

    Donc ça résoud bien le problème pour le println mais ma JSF me renvoie encore la même erreur . J'ai toujours apparemment des objets de type PersistentSet

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Par défaut
    Bon, finalement le problème venait du datatable qui n'aime pas les set comme value. Comme indiqué dans les cours et tutoriels pour bien apprendre Java : http://java.developpez.com/cours/ il n'accepte que les :
    • tableau
    • java.util.List
    • java.sql.ResultSet
    • javax.servlet.jsp.jstl.sql.Result
    • javax.faces.model.DataModel
    Pour les LazyInitializationException on peut effectivement mettre à false le paramètre lazy mais pour les grosses applis ça peut charger la mémoire avec des objets inutiles.

    On peut arranger ça soit avec un maClasse.getMaCollection (tant que la session est ouverte) ou en utilisant Hibernate.initialize(). Tout ça est décrit là.

    Encore merci.

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

Discussions similaires

  1. Hibernate + suppression d'objets dans une collection
    Par Saiyan54 dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/12/2006, 15h39
  2. [Hibernate] Chargement d'un objet avec XX sous niveau ?
    Par Hikage dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/07/2006, 17h14
  3. [hibernate] rattaché un objet détaché
    Par agougeon dans le forum Hibernate
    Réponses: 4
    Dernier message: 31/05/2006, 17h52
  4. [hibernate] Collection d'objet persistent
    Par Invité dans le forum Hibernate
    Réponses: 10
    Dernier message: 28/04/2006, 16h56
  5. Chargement d'objets
    Par k4eve dans le forum Hibernate
    Réponses: 4
    Dernier message: 07/05/2004, 16h06

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