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 3 : pourquoi je n'obtiens qu'une seule instance et non la liste complète ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut Hibernate 3 : pourquoi je n'obtiens qu'une seule instance et non la liste complète ?
    Bonjour,

    Je n'arrive pas à me sortir d'un petit problème, ainsi je me tourne vers vous.

    Je travaille sur un projet qui gère un championnat d'un sport collectif. Je travaille sur Hibernate 3 qui utilise une base MySQL 5.

    J'ai à disposition deux classes : Equipe et Personne.

    Voici leur description SQL :
    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
     
    DESC PERSONNE;
    +----------------+-------------+------+-----+---------+-------+
    | Field          | Type        | Null | Key | Default | Extra |
    +----------------+-------------+------+-----+---------+-------+
    | OID            | int(11)     | NO   | PRI | NULL    |       |
    | NOM            | varchar(40) | NO   |     | NULL    |       |
    | PRENOM         | varchar(40) | YES  |     | NULL    |       |
    | DATE_NAISSANCE | date        | NO   |     | NULL    |       |
    | LICENCE        | int(11)     | YES  |     | NULL    |       |
    | ESTARBITRE     | tinyint(1)  | YES  |     | 0       |       |
    | ESTJOUEUR      | tinyint(1)  | YES  |     | 1       |       |
    | ESTPRESIDENT   | tinyint(1)  | YES  |     | 0       |       |
    | OID_EQUIPE     | int(11)     | YES  | MUL | NULL    |       |
    +----------------+-------------+------+-----+---------+-------+
     
    DESC EQUIPE;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | OID   | int(11)     | NO   | PRI | NULL    |       |
    | NOM   | varchar(50) | NO   | UNI | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    La table Personne a une clé étrangère (OID_EQUIPE), correspondant à la clé de la table Equipe.

    Côté Hibernate, suivent les fichiers nécessaires dont j'omets volontairement les déclarations de DTD :
    (1) hibernate.cfg.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
     
    <hibernate-configuration>
    	<session-factory>
    		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/championnat</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">justdoit</property>
    		<property name="hibernate.show_sql">true</property>
    		<!--  Mapping -->
    		<mapping resource="champ/Personne.hbm.xml"/>
    		<mapping resource="champ/Equipe.hbm.xml"/>
    	</session-factory>
    </hibernate-configuration>
    (2) Personne.hbm.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
     
    <hibernate-mapping>
    	<class name="champ.Personne" table="PERSONNE">
    		<id name="OID" column="OID">
    			<generator class="increment"/>
    		</id>
    		<property name="nom"/>
    		<property name="prenom"/>
    		<property name="dateNaissance" type="date" column="DATE_NAISSANCE"/>
    		<property name="licence"/>
    		<property name="arbitre" column="ESTARBITRE"/>
    		<property name="joueur" column="ESTJOUEUR"/>
    		<property name="president" column="ESTPRESIDENT"/>
    		<many-to-one name="equipe" column="OID_EQUIPE"/>
    	</class>
    </hibernate-mapping>
    (3) Equipe.hbm.xml
    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="champ.Equipe" table="EQUIPE">
    		<id name="OID" column="OID">
    			<generator class="increment"/>
    		</id>
    		<property name="nom"/>
    		<set name="joueurs" inverse="true">
    			<key column="OID_EQUIPE"/>
    			<one-to-many class="champ.Personne"/>
    		</set>
    	</class>
    </hibernate-mapping>
    Maintenant, les classes mappées côté Java :
    (1) Personne.java
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    package champ;
     
    import java.sql.Date;
     
    public class Personne {
     
    	private Long OID;
    	private String nom;
    	private String prenom;
    	private Date dateNaissance;
    	private int licence;
    	private boolean arbitre;
    	private boolean joueur;
    	private boolean president;
    	private Equipe equipe;
     
    	public Long getOID() {
    		return OID;
    	}
    	public void setOID(Long oid) {
    		OID = oid;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public String getPrenom() {
    		return prenom;
    	}
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    	public Date getDateNaissance() {
    		return dateNaissance;
    	}
    	public void setDateNaissance(Date dateNaissance) {
    		this.dateNaissance = dateNaissance;
    	}
    	public int getLicence() {
    		return licence;
    	}
    	public void setLicence(int licence) {
    		this.licence = licence;
    	}
    	public boolean isArbitre() {
    		return arbitre;
    	}
    	public void setArbitre(boolean arbitre) {
    		this.arbitre = arbitre;
    	}
    	public boolean isJoueur() {
    		return joueur;
    	}
    	public void setJoueur(boolean joueur) {
    		this.joueur = joueur;
    	}
    	public boolean isPresident() {
    		return president;
    	}
    	public void setPresident(boolean president) {
    		this.president = president;
    	}
    	public Equipe getEquipe() {
    		return equipe;
    	}
    	public void setEquipe(Equipe equipe) {
    		this.equipe = equipe;
    	}
    }
    (2) Equipe.java
    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
     
    package champ;
     
    import java.util.Set;
     
    public class Equipe {
    	private Long OID;
    	private String nom;
    	private Set joueurs;
     
    	public Long getOID() {
    		return OID;
    	}
    	public void setOID(Long oid) {
    		OID = oid;
    	}
    	public String getNom() {
    		return nom;
    	}
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
    	public Set getJoueurs() {
    		return joueurs;
    	}
    	public void setJoueurs(Set joueurs) {
    		this.joueurs = joueurs;
    	}
    }
    Mon problème est le suivant : j'ai une bonne dizaine d'instances de Personne dont le champ OID_EQUIPE est commun. Malheureusement, quand j'exécute mon code Java, seule la première instance est remontée, je ne vois pas pourquoi.

    Voici le code Java qui ne fonctionne pas tout à fait :

    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
     
    	private static Equipe chercherEquipe(Long OID) {
    		Equipe uneEquipe = null;
    		try {
    			uneEquipe = (Equipe)session.get(Equipe.class, OID);
    			/*java.util.List<Equipe> list = session.createCriteria(Equipe.class).add(Restrictions.eq("OID", OID)).list();
    			if (list != null) {
    				Iterator<Equipe> i = list.iterator();
    				while (i.hasNext()) {
    					uneEquipe = i.next();
    				}
    			}*/
    		} catch (Exception e) {
    			System.out.println(e.toString());
    		}
    		return uneEquipe;
    	}
     
    	private static void joueursComposantEquipe(Long OID_equipe) {
    		Equipe E = chercherEquipe(OID_equipe);
    		if (E == null)
    			return;
    		try {
    			System.out.println("--------------------");
    			System.out.println(E.toString());
    			System.out.println("--------------------");
    			System.out.println(E.getJoueurs().size());
    		} catch (Exception e) {
    			System.out.println("--- joueursComposantEquipe ---");
    			e.printStackTrace();
    		}
    	}
    La méthode chercherEquipe fait correctement son travail, elle remonte la bonne instance d'Equipe. Malheureusement, la méthode joueursComposantEquipe ne remonte que la première instance Personne, bien que Equipe ait pour attribut joueurs de type Set. L'erreur serait-elle là ? Ou alors, mon code Java est-il complètement faux ? A priori, je suis supposé pouvoir obtenir toute la liste des joueurs sans passer par la classe Criteria.

    A l'exécution de la méthode joueursComposantEquipe, le log indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Hibernate: select joueurs0_.OID_EQUIPE as OID9_1_, joueurs0_.OID as OID1_, joueurs0_.OID as OID0_, joueurs0_.nom as nom0_0_, joueurs0_.prenom as prenom0_0_, joueurs0_.DATE_NAISSANCE as DATE4_0_0_, joueurs0_.licence as licence0_0_, joueurs0_.ESTARBITRE as ESTARBITRE0_0_, joueurs0_.ESTJOUEUR as ESTJOUEUR0_0_, joueurs0_.ESTPRESIDENT as ESTPRESI8_0_0_, joueurs0_.OID_EQUIPE as OID9_0_0_ from PERSONNE joueurs0_ where joueurs0_.OID_EQUIPE=?
    La clause where me laisse pourtant croire qu'elle impose une valeur stricte sur l'attribut OID_EQUIPE...

    Merci par avance de l'aide que vous pourrez m'apporter.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Je vois pas de problème apparent.
    T'es sur que t'envoies le bon OID d'équipe?

    Juste pour voir si c'est le problème, je te propose un test tout simple.
    Utilise la même valeur d'OID d'équipe que précédemment et fais une requête hql à partir de l'entité personne ou tu sélectionnes toutes les personnes de l'équipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    getSession().createQuery("from Personne where equipe.OID=:id")
                     .setParameter("id", id);

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Voici le code ajouté selon tes conseils :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			List l = session.createQuery("from Personne where equipe.OID=:id").setParameter("id", OID_equipe.longValue()).list();
    			System.out.println(l.size());
    Hélas, une exception remonte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException
    	at org.hibernate.hql.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:27)
    	at org.hibernate.impl.SessionFactoryImpl.createQueryTranslators(SessionFactoryImpl.java:357)
    	at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:423)
    	at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)
    	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
    	at exe.Principale.joueursComposantEquipe(Principale.java:166)
    	at exe.Principale.main(Principale.java:56)
    Quelle classe manquerait au projet ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    La honte...

    En fait, j'aurais mieux fait de vérifier la base toute entière, elle était complètement corrompue ! Le DBA vient de la restaurer, tout fonctionne à merveilles !

    Cependant, j'aimerais comprendre quelle classe manquante provoque l'exception ci-dessus...

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Surement une classe de la lib antlr.
    Le parser de requête en a besoin.
    Ajoute la lib dans une version compatible avec ta version d'Hibernate et ca devrait marcher.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Bonjour,

    Effectivement, je n'avais pas la bonne lib. J'avais par erreur pris la ant-antlr-1.6.3.jar au lieu de antlr-2.7.5H3.jar.

    Tout fonctionne parfaitement bien maintenant.

    Merci pour ton aide !

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

Discussions similaires

  1. Une seule instance de l'appli et exécuter une procédure
    Par Manic dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 08/03/2006, 11h52
  2. [VB.NET]une seule instance par fenetre MDI
    Par pat59 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/02/2006, 11h14
  3. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  4. [JUnit] Avoir une seule instance
    Par hocinema dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 25/10/2005, 15h48

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