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 :

Many to one probleme


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Par défaut Many to one probleme
    Bonjour a tous,
    j'ai un soucis avec mon aplli web je vous explique.
    j'ai une relation many to one entre un pere et des enfants. (Un pere peut avoir plusieurs enfants). Dans mon appli on peut créer, supprimer, updater... des peres et des enfants.
    Le probleme est le suivant, quand je supprime un pere alors qu'il a encore des enfants enregistrés dans la base de donnée ca merdouille!
    Je voulais donc créer dans mon DaoPere une fonction deleteIsPossible(Pere) qui retournesi la suppression est possible ou non.
    La seule idée que je vois est de parcourir tout mes enfants et de voir si l'un d'eux a pour pere celui passé en parametre.
    Maintenant si j'ai 5 enfants ca va, si j'en ai beaucoup beaucoup plus ca va mettre du temps (enfin j'imagine).

    J'aimerais vos conseils pour savoir si la facon de faire est bonne ou si il ya autre chose a faire.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Dans le mapping du Pere, tu lui lies ses fils, il suffirait de tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pere.getFils().size() > 0
    pour savoir s'il a des fils.

    Ceci dit, tu auras chargé (ou tu chargeras) tous les fils... ce qui peut prendre du temps également.
    Une alternative serait de faire une requête à part dans la DAO, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.createSQLQuery("select count(*) from TableFils where ID_PERE=?").setInteger(0, id_pere).uniqueResult();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Tout dépend des contraintes d'intégrité réferentielles concues dans ton modèle physique, si chaque enfant a obligatoirement un père (NOT NULL) c'est normal que ça merde lors d'une suppression du père réferencé dans les enfants. Pour moi si un enfant peut exister sans père (ce qui colle bien avec la réalité), en supprimant un père, coté JPA tu fais simplement une boucle sur la collection d'enfants du père en settant à NULL le champ père, normalement tu n'as aucune requete explicité à faire, c'est une opération JPA classique.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu veux faire quoi au juste.

    1) suppression du père et les fils
    2) suppression du père mais pas des fils
    3) interdire la suppression d'un père s'il a des fils

    Dans tous les cas, tu peux le gérer par la contrainte référentielle sur la clé étrangère de fils ondelete = (cascade, set null, restrict)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Par défaut
    Je voudrais interdire la suppression d'un pere s'il a des fils.
    Quand tu dis ans le mapping du Pere, tu lui lies ses fils
    Que veu tu dire par la, ajouter un one to many dans le fichier de mapping ? Ca m'embete un peu vu que la relation est déja faites entre les pere et fils.

    Et peux tu m'en dire un peu plus sur le
    tu peux le gérer par la contrainte référentielle sur la clé étrangère de fils ondelete = (cascade, set null, restrict)

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Par défaut
    Et puis il ya un truc que je ne comprend pas, quand je supprime un pere qui a des enfants, l'id_pere de ceux ci (l'attribut qui lie les 2 tables) est modifié tout seul genre il passe de 9 a 49... Quelqun sait d'ou ca peut venir ?

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    A priori, c'est l'objet père qui devrait avoir une liste d'enfants (relation one-to-many), enfin, ça dépend de ce que tu veux modéliser...
    Ton cas serais : une personne qui a un père et une mère ? (liste chaînée)
    Dans ce cas, la vérification consiste à chercher une personne qui ait l'ID en cours comme ID_PERE ou ID_MERE et ça peut être long...

    Pour ce qui est des clés étrangères, dans une base de données relationnelle, tu peux préciser l'opération / contrôle à effectuer sur une opération delete.
    Bref, si tu positionnes on_delete à :
    - cascade -> tu supprimes les enregistrements qui te référencent
    - restrict -> tu interdits de supprimer si des enregistrements te référencent
    - set null -> tu mets la clé étrangère à null dans les enregistrements qui te référencent

    Pour ton autre problème, je ne sais pas pourquoi l'id_pere change de valeur, il faudrait voir tout le code... mais ça doit être une erreur dans ton code
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par kalurar Voir le message
    Je voudrais interdire la suppression d'un pere s'il a des fils.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try{
       session.delete(pere);
    } catch (HibernateException e){
       // suppression impossible
    }

    Sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean hasChilds = session.createQuery("from Fils f where f.pere = :pere").setParameter("pere",pere).list().size()>0
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean hasChilds = ((Integer)(session.createQuery("select count(*) from Fils f where f.pere = :pere").setParameter("pere",pere).uniqueResult()))>0

Discussions similaires

  1. Debutant probleme many to one
    Par taieb84 dans le forum Hibernate
    Réponses: 2
    Dernier message: 13/01/2010, 17h14
  2. Réponses: 2
    Dernier message: 03/09/2009, 19h26
  3. Probleme many to one
    Par amal_noussair dans le forum Hibernate
    Réponses: 1
    Dernier message: 19/09/2008, 14h13
  4. Hibernate many-to-one probleme id
    Par grizzz dans le forum Hibernate
    Réponses: 1
    Dernier message: 10/09/2008, 14h36
  5. Réponses: 2
    Dernier message: 17/07/2006, 14h45

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