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 :

Problème avec hibernate et mon bean


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut Problème avec hibernate et mon bean
    Hi,

    Voila je suis en train de vouloir intégrer hibernate à mon projet (qui a la base fonctionner normalement). Mon projet est une suite de question grace à un arbre binaire, si ont répond oui, je vais a gauche de l'arbre avec une nouvelle question, si non je vais a droite.

    Voici comment j'ai construit mon bean avant l'insertion d'hibernate et qui fonctionner
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
            private Long id_node;
    	private String question;
    	private String result;
    	private Long id_left_node_children;
    	private Long id_right_node_children;
    	Nodes left;
    	Nodes right;
     
        private final static Map<Long, Nodes> nodes=new HashMap<Long,Nodes>();
     
    	public Nodes(Long id, String question, String result, Long id_left_node_children, Long id_right_node_children) 
    	{
    	       this.id_node=id;
    	       this.question=question;
    	       this.result=result;
    	       this.id_left_node_children=id_left_node_children;
    	       this.id_right_node_children=id_right_node_children;
    	       nodes.put(id, this);
    	}
     
            public void setLeftnode(Nodes left) 
    	{
    		this.left = left;
    	}
     
    	public Nodes getLeftnode() 
    	{
    		return nodes.get(id_left_node_children);
    	}
     
    	public void setRightnode(Nodes right) 
    	{
    		this.right = right;
    	}
     
    	public Nodes getRightnode() 
    	{
    		return nodes.get(id_right_node_children);
    	}
    En insérant hibernate, j'ai juste ajouter les annotations @Column pour id, question, result, id_left/right_node et @Transient pour Nodes left/right, le reste du bean reste le meme.

    Maintenant ma dao ou je créer une collection de ma bdd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         public Nodes select (HttpServletRequest request) throws Dao_exception
        {
            List <Nodes> nodeList = new ArrayList<Nodes>();
            nodeList = em.createQuery("SELECT n FROM Nodes n").getResultList();
     
            return nodeList.get(0);
        }
    Dans ma jsp je fais juste un test d'affichage comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <c:out value="${nodes.getQuestion() }"></c:out>
    Ce test la fonctionne puisque je ne descend pas dans l'arbre. Il me montre bien la première question de l'arbre

    Par contre, en faisant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <c:out value="${nodes.getRightnode().getQuestion() }"></c:out>
    Cela ne m'affiche rien, je n'ai pas un message d'erreur, juste une page blanche.

    Grace à ce test, je comprends que le problème vient (enfin je suppose) de la partie @Transient et des getters setters de mes noeuds. Pour moi, je pense que hibernate ne comprend pas cette partie et ne descend pas dans l'arbre

    Est ce que en insérant hibernate, il faut fonctionner différemment ou est juste une erreur que je ne vois pas ?

    merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu les as déclarés transient, ce qui veux dire qu'hibernate ne va pas les remplir, les champs resteront null. Si tu ne fais pas toi même quelque chose pour le remplir, ce champ restera null.

    Tout le concept que tu as, d'utiliser des id, n'as pas beaucoup de sens en hibernate. Tu dois aussi avoir un constructeur par défaut.

    Ton mapping serait plus correct comme ceci il me semble:




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            @Id(column="id")
            private Long id_node;
    	private String question;
    	private String result;
    	// au revoir private Long id_left_node_children;
    	// au revoir private Long id_right_node_children;
    	@OneToOne(fetch= FetchType.LAZY)
            Nodes left;
    	@OneToOne(fetch= FetchType.LAZY)
            Nodes right;
     
        // au revoir private final static Map<Long, Nodes> nodes=new HashMap<Long,Nodes>();
     
    	public Nodes() {}

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    Hello,

    Désolé pour le retard !

    Le principe du @Transient je l'avais compris et c était a la base le but rechercher, mais quand je me suis aperçu que cela ne servais a rien, je me suis pencher effectivement sur le @OneToOne mais tout en gardant les id_left/right.

    Mais si je suis ta logique, il faut aussi enlever les id/left_right. Alors comment mapper les id qui sont en bdd pour que cela fonctionne comme avant ?

    merci !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Dans hibernate, quand tu dit qu'un objet A référence un objet B, hibernate se charge de stocker dans la table A un clé id_B qui référence la clé primaire de B. Tout l'intérêt c'est que tu n'a pas a polluer tes bean avec les clés étrangères. en l'occurence, le fait d'avoir un Node left et un Node right suffit à hibernate pour savoir que tu a besoin d'un colonne left de type Number qui est un clé étrangère vers Node.id et une colonne right de type Number qui est un clé étrangère vers Node.id.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    ok super,

    je vois ce que tu veut dire.
    Grosso modo il faut un fichier hibernate.cfg.xml (que pour être franc j'en avait pas encore l'utilité) et faire un mapping du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <hibernate-mapping>
    	<class name="Nodes" table="node">
    		<id name="id" type="java.lang.Integer">
    			<column name="id_node" />
    			<generator class="identity" />
    		</id>
    		<one-to-one name="left_node" class="Nodes"></one-to-one>
    	</class>
    </hibernate-mapping>
    Bon la je suppose qu'il n'est pas complet mais le principe est la ?

    merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 53
    Par défaut
    Hello,

    Bon j'ai essayer d'avancer un peu sur le problème. J'ai donc créer un fichier Nodes.hbm.xml que j'ai fait comme ceci

    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="beans.Nodes" table="node">
            <id name="id" type="int" access="field">
                <column name="id" />
                <generator class="assigned" />
            </id>
            <property name="question" type="java.lang.String">
                <column name="question" />
            </property>
            <property name="result" type="java.lang.String">
                <column name="result" />
            </property>
            <one-to-one name="left" class="beans.Nodes" access="field"></one-to-one>
            <one-to-one name="right" class="beans.Nodes" access="field"></one-to-one>
        </class>
    </hibernate-mapping>
    Eclipse me mets une exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call: SELECT id, question, result, LEFT_id, RIGHT_id FROM node
    Query: ReadAllQuery(referenceClass=Nodes sql="SELECT id, question, result, LEFT_id, RIGHT_id FROM node")
    La je comprends que le probleme vient de ma requete puisqu'il cherche left/right_id dans ma bdd ... sauf qu'ils n existent pas.

    Merci

    PS: J'ai essayer la méthode "bourine" en modifiant le nom de mes id left/right directement dans ma bdd en les renommant LEFT_ID et RIGHT_id et sa marche correctement. Par contre tout est inverser, quand je réponds oui il va a droite alors qu il devrait aller a gauche et inversement.

    Je pense que hibernate ne fais pour l instant pas la distinction entre gauche et droite.

Discussions similaires

  1. Problème avec Hibernate
    Par ISID dans le forum Hibernate
    Réponses: 13
    Dernier message: 05/10/2007, 12h27
  2. Problème avec Hibernate synchronizer
    Par jason69 dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/08/2007, 11h35
  3. [FTP] Problème avec fopen ou mon hébergeur ?
    Par YagamiLight dans le forum Langage
    Réponses: 2
    Dernier message: 06/07/2007, 17h06
  4. [DAO] problème avec Requery sur mon recordset
    Par vcattin dans le forum VBA Access
    Réponses: 8
    Dernier message: 03/04/2007, 23h08
  5. [Hibernate] Problème avec Hibernate et Eclipse 3
    Par theseuby dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/03/2006, 21h31

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