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 de mapping [Mapping]


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Problème de mapping
    Bonjour,

    Je débute avec Hibernate, j'ai crée 2 "entitys" en rapport avec deux tables d'une base PostgreSQL:

    Table utilisateur:
    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
    @Entity
    @Table(name = "utilisateurs", schema = "donnees")
    public class Utilisateurs implements Serializable
    {
    	private static final long serialVersionUID = -4453859136286916778L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "clef", nullable = false)
    	private Long clef;
     
    	@Column(name = "libelle", length = 255, nullable = false)
    	private String libelle;
     
    	@OneToMany(mappedBy="utilisateurs")
    	List<Evenements> evenements;
     
    	public Long getClef()
    	{
    		return clef;
    	}
     
    	public String getLibelle()
    	{
    		return libelle;
    	}
     
    	public List<Evenements> getEvenements()
    	{
    		return evenements;
    	}
    }
    lié à une table "evenement" dont le champ "evenement" pointe sur le champ clef de la table utilisateurs:
    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
    @Entity
    @Table(name = "evenements", schema = "donnees")
    public class Evenements implements Serializable
    {
    	private static final long serialVersionUID = 6231540557299889809L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "clef", nullable = false)
    	private Long clef;
     
    	@ManyToOne
    	private Utilisateurs utilisateurs;
     
    	@Column(name = "description", length = 255, nullable = false)
    	private String description;
     
    	public Long getClef() {
    		return clef;
    	}
     
    	public Utilisateurs getUtilisateurs() {
    		return utilisateurs;
    	}
     
    	public String getDescription() {
    		return description;
    	}
    }
    J'ai supprimé les "setters" car je ne fais que de la lecture.

    Ensuite je rempli un modèle en faisant une requête qui lie ces deux tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public List<UtilisateursInfo> listUtilisateursInfo()
    {
    	String sql  = "Select new "+UtilisateursInfo.class.getName()+"(u.clef as idUtilisateur,u.libelle,e.clef as idEvenement,e.description) ";
    	   	   sql += "from " + Evenements.class.getName() + " e ";
    		   sql += "inner join " + Utilisateurs.class.getName() + " u ";
    	Session session = this.sessionFactory.getCurrentSession();
    	Query<UtilisateursInfo> query = session.createQuery(sql, UtilisateursInfo.class);
    	return query.getResultList();
    }
    Hors la Hibernate me fait le requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select utilisateu1_.clef as col_0_0_, utilisateu1_.libelle as col_1_0_, evenements0_.clef as col_2_0_, evenements0_.description as col_3_0_ from donnees.evenements evenements0_ inner join donnees.utilisateurs utilisateu1_ on
    Il me remplit rien après le "on" ce qui donne une exception "ERROR: syntax error at end of input".

    Si, dans les entity, je remplace les liens via des objets et que je mette à la place des "long" représentant les "ids", cela fonctionne avec la modification suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sql  = "Select new "+UtilisateursInfo.class.getName()+"(u.clef as idUtilisateur,u.libelle,e.clef as idEvenement,e.description,s.clef as idSignale,s.ip) ";
    	   	   sql += "from " + Evenements.class.getName() + " e ";
    		   sql += "inner join " + Utilisateurs.class.getName() + " u on e.utilisateur = u.clef ";
    Bon le je précise le "on e.utilisateur = u.clef".

    Mais j'aimerai savoir pourquoi Hibernate ne fait pas le lien quand je lie les deux tables par leurs objets au lieu de seulement leurs identifiants.

    Merci de votre aide !

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut OK
    Je viens de trouver, il faut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @JoinColumn(name="utilisateur")
    sur le @ManyToOne, sinon il prend par défaut un nom de champ utilisateurs_clef (table + clef primaire).

    Hors dans ma table "evenement", le champs qui référence la table utilisateurs s'appelle "utilisateur" (sans s).

    Et dans le HQL il faut simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sql  = "Select new "+UtilisateursInfo.class.getName()+"(u.clef as idUtilisateur,u.libelle,e.clef as idEvenement,e.description) ";
    sql += "from " + Evenements.class.getName() + " e ";
    sql += "inner join e.utilisateurs u";
    Bin bin, je me remercie moi même alors

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

Discussions similaires

  1. [IBATIS/mysql] problème de mapping
    Par iftolotfi dans le forum Persistance des données
    Réponses: 3
    Dernier message: 07/07/2006, 10h40
  2. [Débutant] Problème de mapping des ports
    Par zehle dans le forum VHDL
    Réponses: 1
    Dernier message: 22/05/2006, 22h37
  3. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  4. [CASTOR]Problème de mapping de données
    Par chuck norris dans le forum Persistance des données
    Réponses: 1
    Dernier message: 13/07/2005, 22h01
  5. [Struts] Problème de mapping
    Par ArseNic dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/02/2005, 10h11

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