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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    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
    Points : 9 529
    Points
    9 529
    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();

  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
    Points : 3 938
    Points
    3 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
    Points : 9 529
    Points
    9 529
    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)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    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
    Points : 9 529
    Points
    9 529
    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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Je pensais que mettre une relance many -to -one dans le mapping enfant ou mettre un one to many dans pere revenait au meme.
    Quelle est la différence? dans les 2 cas un pere peut avoir plusieurs enfants.

  9. #9
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    <many-to-one> est utilisé pour référencer un objet pour une clé étrangère
    (typiquement le Pere dans ton objet Fils)

    <one-to-many> est utilisé pour référencer une liste d'objets liés à l'objet en cours
    (typiquement un Set ou un List de Fils dans Pere)

    On utilise le cas 2 pour une relation hiérarchique (en-tête facture - lignes facture, etc...)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta réponse, je t'avoue que j'ai du mal a comprendre globalement comment tout cela marche.
    Merci pour les réponses je vais continuer ce que je voulais faire sur mon appli (c a d mettre en place struts 2 et spring)

  11. #11
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Pour simplifier
    1) <many-to-one>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Fils
    {
       ...
       private Pere pere;
       ...
    }
    1) <one-to-many>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Pere
    {
       ...
       private List<Fils> fils;
       ...
    }
    Tu veux utiliser Struts 2 ?
    Je ne sais pas si ça a évolué ces derniers temps parce que pour trouver de la bonne documentation c'était bien galère mais entre JSF et Struts 2, personnellement, c'est JSF que je choisirais.
    Un cocktail explosif : JSF + Facelets + RichFaces + Seam + EJB3

    Bonne chance

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    En fait a l'epoque j'avais fait un stage ou on utilisait Hibernate spring et Struts 2 et je voulais retrouver cet environnement.
    Sur l'appli que je fait j'ai pas vraiment de contrainte, je me remet juste dans le bain de la prog comme j'ai trouvé un taff et que je commence dans 2 semaines, en fait c'est surtout spring et hibernate que je voulais mettre en place.

    Pour le one to many et many to one j'ai capté, d'apres ce que j'ai compris il faut que mes tables soit de types innoDB pour créer la relation sur la foreign key. En fait j'ai juste ma table de Pere avec Id, Nom Prenom, et ma tabl Enfant avec Id, Nom, Prenom, IdPere. Et ma relation est juste crée dans le mapping de la classe Enfant abec une many to one sur IdPere.

    Au final j'affiche ca http://parra.pierre.free.fr/Crud.JPG

  13. #13
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    D'un point de vue purement fonctionnel, un père est une personne et un fils également. Il serait donc plus "juste" de créer une relation de Personne -> Personne par une clé étrangère "parent".
    Tu aurais donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Personne
    {
       private Integer UID;
       private Integer PERE_UID;
       private String nom;
       private String prenom;
       ...
    }
    On peut représenter également MERE_UID si besoin, ce n'est pas du sexisme

    Du coup, tu as une représentation totalement arborescente d'une personne...

    Pour les contraintes d'intégrités, effectivement, avec MySQL, il faut utiliser innoDB (ce que je te conseille dans tous les cas d'ailleurs)

    Sinon, cool, et bonne chance pour ton nouveau job

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Merci bien, je suis en ce moment entrain de me demerder pour comprendre spring, j'ai encore bien du mal a comprendre ce qu'il apporte a une appli avec hibernate (sans utiliser le spring MVC)

  15. #15
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    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

  16. #16
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalurar Voir le message
    je suis en ce moment entrain de me demerder pour comprendre spring, j'ai encore bien du mal a comprendre ce qu'il apporte a une appli avec hibernate (sans utiliser le spring MVC)
    C'est basé sur l'inversion de contrôle, en gros, ça permet de spécifier par un fichier de paramétrage un objet qui serait inclut dans un autre (en très très simplifié)
    L'intérêt de Spring ? Euh, franchement, dans le cas d'une application pour 1 client, il n'y en a pas vraiment. Par contre, pour un progiciel, destiné à plusieurs clients, avec des paramétrages différents, là, il n'y a pas photo...
    Ou alors, on passe aux EJB...

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