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 :

Jointure entre 2 tables en une seule classe [Mapping]


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut Jointure entre 2 tables en une seule classe
    Bonjour à tous !

    Je suis débutant en Hibernate et je rencontre quelques soucis dans son utilisation. J'espère que vous saurez m'aider :-)
    Voici mon problème :

    J'ai une base de données contenant plusieurs tables dont 2 en relations l'une à l'autre :
    parcel(id, champ1, champ2,...) et parcel_cstm(id_c, champs_cstm1, champ_cstm2). parcel_cstm est en fait un "prolongement" de la table parcel, les champs cstm auraient pu être directement dans la table parcel mais il est impossible de toucher à la table parcel, on passe donc par une nouvelle table dont la liaison est fait par id_c (parcel.id = parcel_cstm.id_c)
    Je tiens à préciser que je NE PEUX PAS MODIFIER cette architecture !

    Mon souci est que je voudrais mapper ces 2 tables dans une seule classe java Parcel qui aurait les attributs champ1, champ2, champ_cstm1 et champ_cstm2.
    Quelles annotations dois-je mettre dans ma classe pour réaliser un tel mapping ?


    Je vous pose cette question car c'est un travail que j'ai repris et qui ne fonctionne pas complétement. Voici ce qui a été fait:

    La classe Parcel a été mappé de cette manière :
    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
    @Entity
    @Table (name="parcel")
    public class Parcel implements Serializable {
     
    	@Id
    	@Column
    	private String 		id;
    	@Column
    	private int			champ1;
    	@Column
    	private int			champ2;
    	@Column
    	private String			champ_cstm1;
    	@Column
    	private String			champ_cstm2;
     
            ...

    Ensuite pour récupérer la liste des parcel en base on exécute cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = session.createSQLQuery( "select DISTINCT parcel.*, parcel_cstm.* from parcel, parcel_cstm 
    where parcel_cstm.id_c = parcel.id").addEntity(Parcel.class).list();
    Étrangement (?) je récupère bien ma liste de parcel avec les champs normaux et les champs cstm dans le même objet MAIS j'ai besoin de faire un session.refresh() sur chaque objet car ils peuvent être modifié à la volée (par un autre programme) et donc parfois les résultats ne sont pas "à jour". Or ce refresh ne fonctionne pas ! J'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ATTENTION: SQL Error: 1054, SQLState: 42S22
    19 janv. 2012 11:29:17 org.slf4j.impl.JCLLoggerAdapter error
    GRAVE: Unknown column 'parcel0_.champ_cstm1' in 'field list'
    19 janv. 2012 11:29:17 com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
    GRAVE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
    org.hibernate.exception.SQLGrammarException: could not execute query
            at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
            at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
            at org.hibernate.loader.Loader.doList(Loader.java:2235)
    ...
     
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'parcel0_.champ_cstm1' in 'field list'
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    Avez-vous une idée du problème? Pourquoi le refresh retourne t-il cette erreur alors que la requête fonctionne bien si je ne le met pas ?

    Désolé pour le pavé, mais comme je sais que vous n'avez pas de boule de cristal j’essaie de bien exposer mon problème :p

    Merci d'avance pour votre aide,
    @ bientôt !

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Par défaut
    Hello !

    De mon point de vue, tu ne peux pas rafraichir les données de ton objet résultat.
    En fait, tu utilises ta classe Parcel comme un conteneur de résultat de requête, c'est à dire que seuls les noms de tes colonnes sont utilisés pour mapper le résultat de ta requête.
    Tu aurais pu faire aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Entity
    @NamedNativeQueries({ @NamedNativeQuery(name = "getParcel", query = "select DISTINCT parcel.*, parcel_cstm.* from parcel, parcel_cstm 
    where parcel_cstm.id_c = parcel.id", resultClass = Parcel.class) })
    public class Parcel...
    Et l'appel de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query q = session.getNamedQuery("getParcel");
    Mais tu ne pourras pas faire d'update, insert, refresh avec cet objet, c'est juste du one-shot !

    Pour faire ce que tu veux, tu aurais dû faire une classe par table et donc faire une relation entre tes 2 classes (correspondant aux 2 tables). Ainsi, tu aurais pu avoir des "classes persistantes" et ta requête aurait été qqch du genre (en hql) "from Parcel"

    Bon courage !

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut
    Ok! Je vois ce que tu veux dire, effectivement je ne m'y prend pas de la bonne manière.

    Je te remercie pour ton aide

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/02/2014, 17h07
  2. Réponses: 11
    Dernier message: 30/08/2010, 17h24
  3. Mapper deux tables sur une seule classe
    Par gorgonite dans le forum Zend_Db
    Réponses: 13
    Dernier message: 30/06/2008, 13h06
  4. Jointure entre deux champs d'une même table
    Par oubli dans le forum Requêtes
    Réponses: 8
    Dernier message: 11/12/2007, 16h20
  5. Optimisation d'une jointure entre 3 tables
    Par gavelin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/12/2005, 09h52

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