-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 
Author Message
 Post subject: [Netbeans/Xdoclet] Suppression en cascade (1 à plusieurs)
PostPosted: Sat Jun 16, 2007 5:13 pm 
Newbie

Joined: Sat Jun 16, 2007 3:02 pm
Posts: 3
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 (et j'utilise la dernière version disponible d'Hibernate).

Code:
Table question :
id     q_intitule                                        q_id_axe
1      Comment faire fonctionner Hibernate ?             1


Code:
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:
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:
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:
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


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jun 17, 2007 9:10 am 
Newbie

Joined: Sat Jun 16, 2007 3:02 pm
Posts: 3
Je viens de trouver mes fichiers de mapping dans le war, les voici :

Pour Axes :
Code:
<?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:
<?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>


J'avoue ne pas trop comprendre, on a bien la directive cascade et pourtant aucun effet :/


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 18, 2007 2:30 am 
Newbie

Joined: Sat Jun 16, 2007 3:02 pm
Posts: 3
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.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.