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 :

HQL - relation many-to-many


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut HQL - relation many-to-many
    Bonjour,

    j'ai une classe et une table Erreurs contenant un id et un libelle qui représente une nomenclature d'erreurs.

    J'ai également une classe et une table AA qui contient un certain nombre d'informations.

    Un AA pouvant avoir une liste d'erreurs et une erreur pouvant être dans plusieurs AA, j'ai une table d'association entre les deux objets : erreurs_aa.

    Au niveau de mon fichier .hbm de l'AA, j'ai mappé la relation many-to-many de la manière suivante : «
    <set name="listeErreurs" table="ERREURS_AA" >
    <key column="IDEN_AA" />
    <many-to-many column="REJ_IDEN" class=".....modele.Erreurs" />
    </set>
    ».

    Je dispose d'une liste contenant l'ID de AA et je souhaite supprimer toutes les erreurs qui leurs sont associées.

    J'ai essayé de déclarer une SQL-QUERY :

    <sql-query name="supprimerErreursAA" cacheable="true" callable="true">
    <![CDATA[
    DELETE FROM ERREURS_AA WHERE IDEN_AA IN (:listeAA)
    ]]>
    </sql-query>

    Query maRequete2 = getSession().getNamedQuery("supprimerErreursAA");
    maRequete2.setParameterList("listeAA", listeAA);
    maRequete2.executeUpdate();

    Hibernate me renvoit une erreur en me disant : « Exception in thread "main" java.lang.UnsupportedOperationException: Update queries only supported through HQL ».

    Je voudrais bien pouvoir faire cela en HQL mais je ne sais pas le faire.
    Avez-vous une idée ?

    Help me.
    Merci beacoup.

    F.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Ne passe pas par une requête SQL native.

    Fais plutôt la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Query query  = session.createQuery("from AA where id in (:id)");
    query.setParamterList("id", listeAA);
    List<AA> aas = query.list();
     
    for(AA aa : aas){
        // Si ta relation est bidirectionnelle
        for(Erreur erreur : aa.getErreurs){
            erreur.getAa().remove(aa);
        }
     
        aa.getErreurs().clear(); 
        session.update(aa);
    }
    L'inconvéniant est que tu dois faire une requête SELECT. Mais Hibernate n'est pas conçu pour faire du delete en masse.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    Merci pour ta réponse,

    >> // Si ta relation est bidirectionnelle
    >> for(Erreur erreur : aa.getErreurs){
    >> erreur.getAa().remove(aa);
    >> }

    A priori, la relation ne devait pas être bidirectionnelle mais s'il le faut, je peux éventuellement la rendre bi-directionnelle.

    >> L'inconvéniant est que tu dois faire une requête SELECT. Mais Hibernate n'est >> pas conçu pour faire du delete en masse.

    Oui, cela ne me va pas. Ce traitement est exécuté dans un batch et il peut gérer un grand nombre de données.

    Est-ce que je ne pourrais pas "courcircuiter" Hibernate pour repasser directement en JDBC et exécuter ma requête ?
    Par contre, je ne sais pas comment je pourrais demander à Hibernate de me renvoyer un objet Statement JDBC sans que lui intervienne ?

    Merci beaucoup,
    F.

Discussions similaires

  1. PGSQL-EclipseLink Relation One To Many et Many To One
    Par faitor1 dans le forum Persistance des données
    Réponses: 0
    Dernier message: 30/01/2015, 20h46
  2. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 19h50
  3. probleme HQL pour asso reflexive many-to-many
    Par tridoo dans le forum Hibernate
    Réponses: 3
    Dernier message: 24/11/2006, 15h21
  4. [hibernate]relation many-to-many
    Par quilo dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/12/2005, 11h07
  5. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 15h26

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