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 :

[Hibernate] Suppression d'un element d'une collection


Sujet :

Hibernate Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut [Hibernate] Suppression d'un element d'une collection
    Voila, j'ai un petit soucis avec Hibernate lorsque j'essais de supprimer un element d'une collection dans une classe :

    Soit une classe User possedant une collection de Fichier.

    Lors de la suppression d'un Fichier de la collection de l'utilisateur, la base ne se met pas à jour.

    Le code principal :

    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
     
    public void supprimerFichier(int idUser,int idFichier) {
     
            User us;
            Fichier f ;
     
            try {
                us = recupererUser(idUser); //Exception a gerer
                f = manager.recupererFichier(idFichier); //On recupère le fichier
     
            }
            catch (IllegalArgumentException e){
                throw e;
            }
            //Test bidon ca passe sans soucis
            if (f == null)
                System.out.println("Probleme de recuperation fichier");
     
            //On reattache l'user a la persistance pour la prise en compte des modif
            try {
                manager.startSession();
                manager.startTransaction();
                manager.attach(us);
                us.removeFichier(f);//On enleve le fichier de la liste
                manager.commit();
                manager.closeSession();
     
              /*  StockageFichier stock = new StockageFichier();
                stock.setEspacePerso(us.getNom()+ us.getPrenom());
                stock.supprimer(f.getNom());*/
     
            } 
            catch (IllegalArgumentException e) {
                e.printStackTrace(); //Avertir du pb le fichier ne peut être supprimé
            } 
            catch (IOException e) {
                e.printStackTrace(); //Avertir du pb le fichier ne peut etre supprimé
            } 
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    Le code de removeFichier de la classe User

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void removeFichier(Fichier fichier) {
                if (fichier == null)
                    throw new IllegalArgumentException("Impossible de retirer un fichier inexistant");     
                fichier.setUser(null);
                this.getFichiers().remove(fichier);
            }
    LOgiquement, l'user etant attaché a la session, les modif devrai etre prise en compte. Faut t'il explicitement supprimé l'objet Fichier (ca me parait a contresens du principe Hibernate).

    Précision : ma relation est déclarer dans les fichier XML avec cascade="all".

    Une idée du soucis ?
    La posix attitude ...

  2. #2
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Tu peux essayer de balancer un flush() juste avant le commit et dire ce qu'il en est ?
    See you, space cowboy... and if you're satisfied, click on

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Avec un flush() juste avant le commit même chose, l'élément n'est pas supprimé de la base de données.

    J'ai testé en debug avec suivi des variable : ma fonction recupererFichier me retourne bien le bon fichier
    La posix attitude ...

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Et en affichant les requetes SQL issues d'Hibernate, est ce que tu vois la requete d'effectuer ou non ?
    See you, space cowboy... and if you're satisfied, click on

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Et ben non justement, aucune trace de requete visant a supprimer ou modifier quoi que ce soit ...

    Voici la trace d'execution lors de l'appel a la methode supprimerFichier ci dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Hibernate: select user0_.id as id0_0_, user0_.nom as nom0_0_, user0_.prenom as prenom0_0_, user0_.societe as societe0_0_, user0_.quota_aut as quota5_0_0_, user0_.quota_cour as quota6_0_0_, user0_.login as login0_0_, user0_.pass as pass0_0_ from utilisateurs user0_ where user0_.id=?
    Hibernate: select fichier0_.id as id1_0_, fichier0_.nom as nom1_0_, fichier0_.date_depot as date3_1_0_, fichier0_.lien_dl as lien4_1_0_, fichier0_.util_id as util5_1_0_ from fichiers fichier0_ where fichier0_.id=?
    Hibernate: select user0_.id as id0_0_, user0_.nom as nom0_0_, user0_.prenom as prenom0_0_, user0_.societe as societe0_0_, user0_.quota_aut as quota5_0_0_, user0_.quota_cour as quota6_0_0_, user0_.login as login0_0_, user0_.pass as pass0_0_ from utilisateurs user0_ where user0_.id=? for update
    Hibernate: select fichiers0_.util_id as util5_1_, fichiers0_.id as id1_, fichiers0_.id as id1_0_, fichiers0_.nom as nom1_0_, fichiers0_.date_depot as date3_1_0_, fichiers0_.lien_dl as lien4_1_0_, fichiers0_.util_id as util5_1_0_ from fichiers fichiers0_ where fichiers0_.util_id=?
    Bizarre bizarre
    La posix attitude ...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Petite remontée, toujours le problème mais je ne vois pas d'ou cela peut venir.

    L'objet est bien attaché à une session, mais pas de modification de la base lors du retrait d'un élément de la Collection.
    La posix attitude ...

  7. #7
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Je viens de lire la doc Hibernate car je me penche sur le probleme de la cascade ... tu as été voir du coté de cascade="all" ou encore, si le fichier doit disparaitre carrément de la base de données (relation Pere/Fils) cascade="all-delete-orphan" dans ton fichier de mapping (au niveau de la collection concernée) ?
    See you, space cowboy... and if you're satisfied, click on

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Oui, je pense pourtant que mon fichier de mapping est correct, mais toujours la même erreur ...

    Fichier de mapping de User :
    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
    <hibernate-mapping >
     
    	<class name="persistance.User" table="utilisateurs">
     
    		<id name="id" type="integer">
     			<column name="id"/>
     			<generator class="sequence" />
     		</id>
     
    		<property name="nom" type="string"> </property>
    		<property name="prenom" type="string"> </property>
    		<property name="societe" type="string"> </property>
    		<!--<property name="tel" type="string"> </property>-->
    		<property name="quotaAut" column="quota_aut" />
    		<property name="quotaCour" column="quota_cour"/>
    		<property name="login" type="string" />
    		<property name="pass" type="string" />
     
    		<set name="fichiers" inverse="true" lazy="true" cascade="all-delete-orphan">
    			<key column="util_id"></key>
    			<one-to-many class="persistance.Fichier"></one-to-many>
    		</set>
     
    	</class>
     
    	</hibernate-mapping>
    MApping Fichier :
    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
    <hibernate-mapping >
     
    	<class name="persistance.Fichier" table="fichiers">
     
    		<id name="id" type="integer">
     			<column name="id"/>
     			<generator class="assigned" />
     		</id>
     
    		<property name="nom" type="string"> </property>
    		<property name="date" type="date" column="date_depot"> </property>
    		<property name="lienDL" type="string" column="lien_dl"> </property>
    		<many-to-one column="util_id" name="user" class="persistance.User"  />
    	</class>
     
    	</hibernate-mapping>
    Vraiment étrange comme erreur, il n'y a aucun ordre de modif ou de suppression d'envoyé à la base de données
    La posix attitude ...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Points : 223
    Points
    223
    Par défaut
    Bon je réponds moi même au problème,
    cela venait simplement du fait qu'il me manquait la redéfinition de equals et hashcode donc le .remove ne pouvait pas fonctionner car il ne retrouvait pas le fichier dans la liste. Logique ...
    La posix attitude ...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2007, 15h54
  2. suppression d'un element d'une liste
    Par Mat_DZ dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 18h58
  3. Réponses: 3
    Dernier message: 31/05/2006, 14h12
  4. Réponses: 4
    Dernier message: 22/12/2005, 11h43
  5. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49

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