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 :

[Netbeans/Xdoclet/Hibernate] Suppression en cascade dans une relation One-To-Many


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 13
    Points
    13
    Par défaut [Netbeans/Xdoclet/Hibernate] Suppression en cascade dans une relation One-To-Many
    Bonjour à tous,

    Je m'adresse à vous car je deviens fou. J'ai beau cherché dans tous les sens, toutes les soutions proposées ne fonctionnent pas

    Pour simplifier, j'ai deux tables, les "axes" et les "questions" (c'est dans le cadre d'un questionnaire, les questions sont classées dans des axes pédagogiques) hebergées par un MySQL 5.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Table question :
    id     q_intitule                                        q_id_axe
    1      Comment faire fonctionner Hibernate ?             1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table axe :
    id     axe_nom
    1      Java
    2      C++
    Donc comme vous le constatez l'axe d'id 1 (Java) est associé à la question 1, tandis que l'axe 2 (C++), lui, n'a aucune association.

    Le problème, c'est qu'en utilisant des méthodes d'Hibernate pour supprimer l'axe Java, j'obtiens toute sorte d'exceptions traitant de violations de contraintes d'intégrité etc... ("Could not execute JDBC batch update"). L'axe C++ ne pose jamais de problèmes.

    Voici mon Bean Hibernate gérant l'axe et la question :

    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
     
    package datas ;
    /**
     * 
     *
     * @hibernate.class
     *     table="AXES"
     *
     */
    public class Axes {
     
      // <editor-fold defaultstate="collapsed" desc=" Property:   String axe_nom ">
      private String axe_nom;
    /**
      *   @hibernate.property
      */
       public String getAxe_nom () {
          return axe_nom;
       } 
       public void setAxe_nom (String axe_nom) {
          this.axe_nom = axe_nom;
       }
       // </editor-fold>
     
      // <editor-fold defaultstate="collapsed" desc=" PrimaryKey:   String id ">
       private String id;
    /**
      *   @hibernate.id
      *     generator-class="uuid.hex"
      */
       public String getId () {
          return id;
       } 
       public void setId (String id) {
          this.id = id;
       }
       //</editor-fold>
     
      // <editor-fold defaultstate="collapsed" desc=" 1-N  Relation to Collection /*datas.Questions*/ questionss ">
       private java.util.Collection questionss;
     
       /**
        * @hibernate.set
        *     role="questionss"
        * @hibernate.collection-key
        *     column="AXES_FK"
        * @hibernate.collection-one-to-many
        *     class="datas.Questions"
        */
       public java.util.Collection getQuestionss() {
           return this.questionss;
       }
     
       public void setQuestionss(java.util.Collection questionss) {
           this.questionss = questionss;
       }
       // </editor-fold>
     
       }
    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
     
    package datas ;
    /**
     * 
     *
     * @hibernate.class
     *     table="QUESTIONS"
     *
     */
    public class Questions {
     
     
    // <editor-fold defaultstate="collapsed" desc=" Property:   String q_intitule ">
      private String q_intitule;
    /**
      *   @hibernate.property
      */
       public String getQ_intitule () {
          return q_intitule;
       } 
       public void setQ_intitule (String q_intitule) {
          this.q_intitule = q_intitule;
       }
       // </editor-fold>
     
    // <editor-fold defaultstate="collapsed" desc=" PrimaryKey:   String id ">
       private String id;
    /**
      *   @hibernate.id
      *     generator-class="uuid.hex"
      */
       public String getId () {
          return id;
       } 
       public void setId (String id) {
          this.id = id;
       }
       //</editor-fold>   
     
    // <editor-fold defaultstate="collapsed" desc=" N-1  Relation to datas.Axes axes ">
       private datas.Axes axes;
     
       /**
        * @hibernate.many-to-one
        *     column="AXES_FK"
        *     class="datas.Axes"
        *     not-null="true"
        *     outer-join="auto"
        */
       public datas.Axes getAxes() {
           return this.axes;
       }
     
       public void setAxes(datas.Axes axes) {
           this.axes = axes;
       }
       // </editor-fold>
    J'ai bien essayé de rajouter la directive cascade="all-delete-orphan" dans le tag @hibernate.many-to-one de la classe Question, comme conseillé dans les sources. Cependant, j'obtiens toujours une exception ! Pareil dans le tag @hibernate.set de la classe Question, j'ai essayé cascade="all", en conjonction avec l'autre directive ou pas. Même résultat...

    Pour information, voici la fonction appelée lors de la suppression d'un axe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public void deleteAxes(Axes axes){
            Session session = datas.HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            session.delete(axes);
            tx.commit();
            datas.HibernateUtil.closeSession();
        }
    Bon... je pense ne pas être vraiment très au point concernant Hibernate, c'est sûr, mais pour le moment je dois résoudre ce problème au plus vite, je m'y metterai plus en profondeur un peu plus tard... Donc si vous aviez une idée, ca serait vraiment super

    Merci d'avance !
    Nik

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    Hibernate travaille avec des Set et non des collections. Essayes çà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private java.util.Set questionss;
     
    public java.util.Set getQuestionss() {
           return this.questionss;
       }
     
       public void setQuestionss(java.util.Set questionss) {
           this.questionss = questionss;
       }
    Si tu as encore d'autres erreurs, penses à mettre le mapping Hibernate des 2 classes.

    Bonne chance

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Merci de ta réponse, j'ai suivi ton conseil mais malheureusement l'utilisation de Set à la place de Collection n'a rien changé.

    Concernant les fichiers de mapping, j'aimerais bien les poster, mais je les trouve pas !! N'est ce pas lié à l'utilisation de XDoclet ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    En fait, je viens de les retrouver dans le war.

    Pour Axes :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping
    >
        <class
            name="datas.Axes"
            table="AXES"
        >
     
            <id
                name="id"
                column="id"
                type="java.lang.String"
            >
                <generator class="uuid.hex">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-Axes.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
     
            <property
                name="axe_nom"
                type="java.lang.String"
                update="true"
                insert="true"
                column="axe_nom"
            />
     
            <set
                name="questionss"
                lazy="false"
                cascade="all-delete-orphan"
                sort="unsorted"
            >
     
                <key
                    column="AXES_FK"
                >
                </key>
     
                <one-to-many
                      class="datas.Questions"
                />
     
            </set>
     
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-Axes.xml
                containing the additional properties and place it in your merge dir.
            -->
     
        </class>
     
    </hibernate-mapping>
    Pour Questions :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping
    >
        <class
            name="datas.Questions"
            table="QUESTIONS"
        >
     
            <id
                name="id"
                column="id"
                type="java.lang.String"
            >
                <generator class="uuid.hex">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-Questions.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
     
            <property
                name="q_intitule"
                type="java.lang.String"
                update="true"
                insert="true"
                column="q_intitule"
            />
     
            <many-to-one
                name="axes"
                class="datas.Axes"
                cascade="all"
                outer-join="auto"
                update="true"
                insert="true"
                column="AXES_FK"
                not-null="true"
            />
     
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-Questions.xml
                containing the additional properties and place it in your merge dir.
            -->
     
        </class>
     
    </hibernate-mapping>

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Bon comme souvent dans ce genre de cas, on trouve la solution avant qu'on nous la suggère

    En lisant les logs générés par Hibernate, j'ai remarqué qu'il essayait d'abord d'attribuer null à la clé étrangère (puis de supprimer les orphelins). Or la clé étrangère était paramétrée comme étant non nulle...

    En modifiant le mapping et en reconstruisant les tables, ca a fonctionné

    Merci quand meme.

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

Discussions similaires

  1. Comment récupérer une liste avec une relation one to many ?
    Par tomlaurent dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/11/2011, 07h16
  2. Problème lors d'un delete avec une relation one-to-many
    Par el_harrathi dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 01/11/2011, 15h01
  3. Réponses: 5
    Dernier message: 18/01/2009, 12h32
  4. Hibernate + suppression d'objets dans une collection
    Par Saiyan54 dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/12/2006, 15h39
  5. Suppression d'item dans une arborescence
    Par jonzuzu dans le forum MFC
    Réponses: 2
    Dernier message: 24/02/2004, 17h45

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