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 3] Delete en cascade


Sujet :

Hibernate Java

  1. #1
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut [Hibernate 3] Delete en cascade
    Salut,

    Je débute avec hibernate, j'ai déjà bien avancé mais je me heurte a des problèmes (je sépare en plusieurs posts).

    J'ai un modèle de donnée utilisé auparavant avec jdbc. J'ai réalisé des fichiers de mapping et positionné des relations one-to-many quand j'en avais besoin

    Exemple, ici un utilisateur (account) peut avoir plusieurs comptes (characters)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <set name="characterses" inverse="true"   cascade="all-delete-orphan">
                <key>
                    <column name="account_name" length="45">
                        <comment></comment>
                    </column>
                </key>
                <one-to-many class="net.sf.l2j.loginserver.beans.Characters" />
            </set>
    Lorsque dans mon DAO je supprime un account avec un accountDAO.delete (account), j'ai droit a une erreur sur la clé étrangère, je sais donc qu'il n'a pas supprimé les fils en premier.

    J'ai précisé cascade="all-delete-orphan", j'ai oublié quelque chose pour qu'ils deletent les fils en cascade ?

  2. #2
    Membre éclairé
    Profil pro
    Abcde
    Inscrit en
    Août 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Abcde
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2004
    Messages : 59
    Par défaut
    Citation Envoyé par hugo123
    Salut,

    Je débute avec hibernate, j'ai déjà bien avancé mais je me heurte a des problèmes (je sépare en plusieurs posts).

    J'ai un modèle de donnée utilisé auparavant avec jdbc. J'ai réalisé des fichiers de mapping et positionné des relations one-to-many quand j'en avais besoin

    Exemple, ici un utilisateur (account) peut avoir plusieurs comptes (characters)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <set name="characterses" inverse="true"   cascade="all-delete-orphan">
                <key>
                    <column name="account_name" length="45">
                        <comment></comment>
                    </column>
                </key>
                <one-to-many class="net.sf.l2j.loginserver.beans.Characters" />
            </set>
    Lorsque dans mon DAO je supprime un account avec un accountDAO.delete (account), j'ai droit a une erreur sur la clé étrangère, je sais donc qu'il n'a pas supprimé les fils en premier.

    J'ai précisé cascade="all-delete-orphan", j'ai oublié quelque chose pour qu'ils deletent les fils en cascade ?
    il faut egalement mettre un 'delete cascade' au niveau de la FK de la base, c'est juste un indicateur pour hibernate lui permettant d'effacer les objets dépendants en mémoire.

    @+

  3. #3
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Ok, j'avais cru à tort que Hibernate pouvait s'en charger tout seul. Ma base de données cible est malheureusement mysql avec moteur myIsam, donc sans FK.

    Merci.

  4. #4
    Membre éclairé
    Profil pro
    Abcde
    Inscrit en
    Août 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Abcde
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2004
    Messages : 59
    Par défaut
    Citation Envoyé par hugo123
    Ok, j'avais cru à tort que Hibernate pouvait s'en charger tout seul. Ma base de données cible est malheureusement mysql avec moteur myIsam, donc sans FK.

    Merci.
    il n'y a pas trigger non plus sur Mysql ?

  5. #5
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Si effectivement, à partir de la version 5.

    C'est une idée à voir.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Salut,
    Je pense moi aussi qu'en principe Hibernate s'occupe tout seul de supprimer les enfants quand on delete le parent. Es-tu certain d'avoir précisé le bon foreign key dans ton mapping de la collection one-to-many ? Je veux dire, est-ce que "account-name" est vraiment la clé primaire de Account ?

  7. #7
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    La table accounts a pour clé primaire :
    login

    La table characters a pour clé primaire :
    obj_id (un id auto généré)
    et pour foreign key :
    account_name

    En effet, il est possible d'avoir un account qui a plusieurs characters.

    Donc non, account_name n'est pas PK sur la table lié. Mais je suppose que c'est bien sur la clé étrangère que je dois lier mes tables. Enfin j'imagine

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Citation Envoyé par hugo123
    La table accounts a pour clé primaire :
    login

    La table characters a pour clé primaire :
    obj_id (un id auto généré)
    et pour foreign key :
    account_name

    En effet, il est possible d'avoir un account qui a plusieurs characters.

    Donc non, account_name n'est pas PK sur la table lié. Mais je suppose que c'est bien sur la clé étrangère que je dois lier mes tables. Enfin j'imagine
    En tout cas, le champ clé étrangère de Characters doit correspondre au champ clé primaire de Accounts, donc "login", sinon ça pourrait pas marcher.

  9. #9
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Ici c'est bien mon cas.

    Mais de facon plus générale, une FK doit pointer sur une clé unique, pas forcé que ce soit une clé primaire je pense.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Pour moi, une FK pointe vers une PK, sinon c'est pas une FK, ou alors faut que je révise mes cours de BD.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Citation Envoyé par fr1man
    Pour moi, une FK pointe vers une PK, sinon c'est pas une FK, ou alors faut que je révise mes cours de BD.
    Je confirme.

  12. #12
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Effectivement.

    Et ici c'est bien mon cas ^^
    Mais ca ne s'efface pas en cascade, du moins hibernate ne s'en charge pas.
    Plus haut on me dit que c'est normal, c'est pas le boulot d'hibernate. Mais tout le monde ne semble pas d'accord. Donc, avis partagé ?

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <set name="characterses" inverse="true"   cascade="all-delete-orphan">
                <key>
                    <column name="login">
                        <comment></comment>
                    </column>
                </key>
                <one-to-many class="net.sf.l2j.loginserver.beans.Characters" />
            </set>
    Si le mapping de ta classe Account contient ce code et que les suppressions en cascade ne pas automatiques, j'aimerais bien voir le code de ton accountDAO, parce qu'en principe Hibernate s'occupe bien des cascades...

  14. #14
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    Hum, dans le fichier accounts.hbm.xml, ce n'est effectivement pas ca. Mais ce fichier est généré par hibernate tools.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            <set name="characterses" inverse="true"   cascade="all-delete-orphan">
                <key>
                    <column name="account_name" length="45">
                        <comment></comment>
                    </column>
                </key>
                <one-to-many class="net.sf.l2j.loginserver.beans.Characters" />
            </set>
    Dans accounts, le set se réfère a la colonne de l'autre table (account_name).

    Je vais faire le test.

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Les "cascade delete" par Hibernate fonctionnent bien chez moi, mais à condition que la clé étrangère du coté "many" pointe vers la clé primaire du coté "one".

Discussions similaires

  1. Delete en cascade ?
    Par SteelBox dans le forum Access
    Réponses: 13
    Dernier message: 15/06/2005, 00h10
  2. Pb avec ON DELETE/UPDATE CASCADE
    Par trotters213 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 09/03/2005, 11h55
  3. Delete en cascade
    Par defrgly57 dans le forum ASP
    Réponses: 3
    Dernier message: 12/04/2004, 12h13
  4. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  5. delete en cascade
    Par bruno270579 dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/12/2003, 17h17

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