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 :

Supprimer l'un des fils d'une liste, via mapping [Mapping]


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Points : 75
    Points
    75
    Par défaut Supprimer l'un des fils d'une liste, via mapping
    Bonjour,
    J'ai un cas qui doit être assez récurrent mais auquel je ne trouve pas de réponse :
    J'ai un objet, disons "Garage", qui a une relation OneToMany avec des objets "Voiture"
    Donc en clair :
    Ma table "Voiture" à une clé étrangère vers ma table "Garage" (car "Garage" peut contenir une collection de "Voiture").

    Et mon mapping est le suivant :
    Classe "Garage"

    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
     
    @Entity
    @Table(name = "garage")
    public class Garage implements java.io.Serializable {
     
        private int id;
        private List<Voiture> voituresList = new ArrayList<Voiture>(0);
     
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "garage")
        public List<Voiture> getVoituresList() {
            return this.voituresList;
        }
     
        public void setVoituresList(List<Voiture> voituresList ) {
            this.voituresList = voituresList ;
        }
    Classe "Voiture"

    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 = "voiture")
    public class Voiture implements java.io.Serializable {
     
        private int id;
        private Garage garage;
     
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "garage_id")
        public Garage getGarage() {
            return this.garage;
        }
     
        public void setGarage (Garage garage) {
            this.garage= garage;
        }
    Fichier Voiture.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <many-to-one class="fr.Garage" fetch="select" name="garage" cascade="all">
                <column name="garage_id">
                </column>
            </many-to-one>
    Fichier Garage.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <bag name="voituresList" table="Voiture" inverse="true" cascade="delete-orphan" lazy="true" fetch="select">
                <key>
                    <column name="garage_id">
                    </column>
                </key>
                <one-to-many class="fr.Voiture" />
            </bag>
    Pour insérer mes objets, je fais quelque chose de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Garage garage = new Garage();
    List<Voiture> voituresList; // Liste de Voiture, étant toutes reliées à Garage (voiture.setGarage(garage))
    garage.setVoituresList(voituresList);
    Lors de l'insertion, mon Garage s'insère bien, ainsi que ma liste de voitures.

    Ma question est donc :
    Si j'avais 6 voitures en base reliées à mon Garage et que je décide d'en supprimer 1, comment faire pour que la suppression se fasse, mais lors d'un UPDATE de mon objet Garage ?

    En gros : Je fais un update de mon objet Garage, je refait un garage.setVoituresList(voituresList) (car je suis obligé de repasser la liste complète des Voitures restantes, je ne peux pas changer ca dans ma modélisation). Je voudrais que la voiture "manquante" dans ma nouvelle liste soit supprimée.

    Je ne sais pas si j'ai été clair ...
    Merci de votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2011
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 97
    Points : 75
    Points
    75
    Par défaut
    Bon ben en fouinant encore plus, j'ai trouvé ma solution :
    Il ne faut pas utiliser le setter de l'objet père pour ré assigner la liste, mais utiliser le getter, faire un clear(), et ajouter les nouvelles données (pour conserver les références originales j'imagine?)

    NE PAS FAIRE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    garage.setVoituresList(myNewVoituresList);
    MAIS FAIRE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    garage.getVoituresList().clear();
    garage.getVoituresList().addAll(myNewVoituresList)
    Bien entendu, pensez à définir correctement les cascade dans vos fichiers HBM

    Garage.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     <bag name="voituresList" table="voiture" inverse="true" cascade="save-update,delete-orphan" lazy="true" fetch="select">
                <key>
                    <column name="garage_id">
                    </column>
                </key>
                <one-to-many class="fr.Voiture" />
            </bag>
    Mais dans le <OneToMany> de Voiture.hbm.xml (classe fille), ne PAS mettre de cascade, notamment sur le delete, car cela signifie que si vous supprimez un des fils, le père sera supprimé, et entrainera donc également la suppression de tous les autres fils.

    En espérant que ceci aide quelqu'un

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/04/2008, 11h21
  2. Supprimer des fichiers depuis une liste déroulante
    Par Flo88 dans le forum VBA Access
    Réponses: 7
    Dernier message: 28/03/2008, 10h14
  3. Comment supprimer des "0" dans une liste
    Par solorac dans le forum Excel
    Réponses: 4
    Dernier message: 04/09/2007, 13h22
  4. [DOM] Ajouter/supprimer des entrées d'une liste déroulante
    Par Zakapatul dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/05/2007, 11h25
  5. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 16h08

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