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 ] Question pour les doués


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut [ HIBERNATE ] Question pour les doués
    Bonjour, je requiert un conseil pour le mapping de ma bdd avec Hibernate

    faut-il mieux utiliser one-to-many ou many-to-one pour lier différentes classes persistantes dans le mapping O/R ?

  2. #2
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut Re: [ HIBERNATE ] Question pour les doués
    Citation Envoyé par Néo-Tony
    Bonjour, je requiert un conseil pour le mapping de ma bdd avec Hibernate

    faut-il mieux utiliser one-to-many ou many-to-one pour lier différentes classes persistantes dans le mapping O/R ?
    Je vais tacher de répondre avec la même clarté que toi : ca dépend.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    alors, soyons plus clair et surtout plus pratique puisque j'ai l'attention d'un expert

    j'ai 3 tables : client, commentaires et appel
    les relations sont
    client -------1:n-------appel
    client -------1:n-------commentaires

    commentdois-je mapper ? 2 one-to-many ou 2 many-to-one

  4. #4
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Classe Commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
        private Client client;
     
        public Client getClient() {
            return client;
        }
        public void setClient(Client c) {
            client = c;
        }
    ...
    mapping de Commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one name="client" class="Client" column="CLIENT_ID"/>
    Classe Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
        private Set commentaires;
     
        public Set getCommentaires() {
            return commentaires;
        }
        public void setCommentaires(Set s) {
            commentaires = s;
        }
    ...
    mapping de Client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="commentaires">
        <key column="CLIENT_ID"/>
        <one-to-many class="Commentaire"/>
    </set>

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    d'accord, je comprends mieux, merci pour ton aide

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 49
    Points : 60
    Points
    60
    Par défaut
    Voici un exemple de maping où pour une souscription on a X assurés.

    <class name="com.elvia.model.Souscription" table="SOUSCRIPTION">
    <id name="idSouscription" unsaved-value="null">
    <column name="SOUS_NUMSEQ" sql-type="long" not-null="true" />
    <generator class="native" />
    </id>
    <property name="numPolice" column="SOUS_NUMPOLICE" />
    <property name="version" column="SOUS_VERSION" />
    ....
    ....


    <bag name="insuredPersons">
    <key column="SOUS_NUMSEQ" />
    <one-to-many class="com.elvia.model.InsuredPerson" />
    </bag>
    </class>

    Mais je n'aime pas trop les bags car au niveau perf ce n'est pas bon.
    Si tu fais une requête qui te ramène 1000 souscriptions cela va enchainer 1000 requetes supplementaires dans la table des personnes Assurés pour charger ton objet souscription.

    Je te conseille plutôt t'utilsation de DAO ou tu ecris ton chargement des objets java dans des méthodes que tu programmes avec un mapping sans bag.

  7. #7
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par c4cf6
    Mais je n'aime pas trop les bags car au niveau perf ce n'est pas bon.
    Si tu fais une requête qui te ramène 1000 souscriptions cela va enchainer 1000 requetes supplementaires dans la table des personnes Assurés pour charger ton objet souscription.
    Ce n'est pas exact. Le comportement va dépendre des options de mapping (cf la doc).

    Citation Envoyé par c4cf6
    Je te conseille plutôt t'utilsation de DAO ou tu ecris ton chargement des objets java dans des méthodes que tu programmes avec un mapping sans bag.
    Je suis d'accord sur l'utilisation d'un DAO mais ils t'ont fait quoi les bags ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 49
    Points : 60
    Points
    60
    Par défaut
    Des problèmes de performance sur un serveur.
    Mon serveur était bloqué pendant 20 secondes avec les putains de bag sur une liste de 1000 enregistrements.
    Depuis que j’ai supprimé les bags la requête de chargement de liste s’exécute en moins de 1 seconde et le serveur n'ai plus en surcharge.

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    puisque je vous ai sous la main,

    pourriez-vous m'expliquer comment fait-on avec un schéma comme suit

    3 tables : client, appel et client_appel (car c'est une realtion du type 1:n)
    dans la bdd, j'ai nécessairement
    client -----1:1----- appel_ps -----1:1----- appel

    et dans la table appel_ps, j'ai pas mal de champs intéressants ( date de l'appel, commentaire sur l'appel, ... )

    comment fait-on pour le mapping ?
    Citation Envoyé par dlemoing
    Classe Commentaire :
    mapping de Commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one name="client" class="Client" column="CLIENT_ID"/>
    mapping de Client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <set name="commentaires">
        <key column="CLIENT_ID"/>
        <one-to-many class="Commentaire"/>
    </set>
    j'ai l'impression que la proposition de dlemoing ne permet pas de récupérer ces champs

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 49
    Points : 60
    Points
    60
    Par défaut
    As tu ecrit tes classes JAVA ?
    Si oui peux tu les donner sinon commence par écrire tes classes et on regarde le mapping après

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    mes classes JAVA sont générés par le fichier de mapping grâce à Hibernate Synchronizer

    d'un côté, client.hbm génère client.java
    de l'autre, appel.hbm génère appel.java

    mais ni dans l'un ni dans l'autre, je ne récupère les champs de la table client_appel


  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 49
    Points : 60
    Points
    60
    Par défaut
    très bien peux tu donner tes fichiers .hbm

  13. #13
    Membre habitué Avatar de agougeon
    Inscrit en
    Mai 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 253
    Points : 147
    Points
    147
    Par défaut
    Bonjour, je suis un peu dans le même genre de problematique que Néo-Tony, alors je poste ici et au cas ou je posterai ailleurs...
    En gros j'ai l'impression qu'avec hibernate il y a plusieur façon de mapper des tables que ce soit pour des relation 0,1 0,n ou n,n. Soit avec ou sans heritage, des set, bag ou join.... enfin je sais pas trop mais j'ai vu pas mal de choses. Dans mon cas je pense pas depasser des resultats a plus de 1000 objets, alors j'aimerai connaitre la façon la plus simple et la plus performente en terme de temps pour ça. Quelles sont les bonnes et les mauvaise méthodes.
    J'utilise des DAO avec hibernate Sync.

    Merci

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    appels.hbm
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping>
    	<class name="org.entreprise.Appel" table="appel">
     
    		<id name="CdApp" type="integer">
    			<column name="cd_app" sql-type="int(1)" not-null="true" />
    			<generator class="increment" />
    		</id>
     
    		<property name="LibelleAppel" type="string">
    			<column name="lb_app" sql-type="varchar(50)" />
    		</property>
     
    		<property name="TypeAppel" type="integer">
    			<column name="ty_app" sql-type="int(1)" />
    		</property>
         <many-to-one name="client" class="client" column="CdAppel"/>
     
    	</class>
    </hibernate-mapping>
    et client.hbm
    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
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
     
    <hibernate-mapping>
    	<class name="org.entreprise.client" table="client">
     
    		<id name="CdClient" type="integer">
    			<column name="cd_cli" sql-type="int(4)" not-null="true" />
    			<generator class="increment" />
    		</id>
     
    		<property name="NuIns" type="integer">
    			<column name="nu_ins" sql-type="int(4)" />
    		</property>
     
    		<property name="RaisonSociale" type="string">
    			<column name="rs_ps" sql-type="varchar(50)" />
    		</property>
     
    		<property name="NomTitulaire" type="string">
    			<column name="nm_ps" sql-type="varchar(50)" />	
     
    <set name="commentaires">
      <key column="CdAppel"/>
      <one-to-many class="appel"/>
    </set>
        </class>
    </hibernate-mapping>
    je pense que c'est la meilleurs façon de mapper (la plus pure)
    mais de cette façon, je fais completement l'impasse sur la table client_appel

  15. #15
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Il existe de nombreux exemples de mapping dans la doc d'hibernate. Pourquoi ne pas les lire, les comprendre, tenter de les appliquer et tester avant de demander aux autres de faire tout le boulot ?

    http://www.hibernate.org/hib_docs/v3/reference/fr/html_single/#example-mappings

    Les relations 1-n, 1-1, m-n sont expliquées, à vous de transposez tout ca dans votre contexte en fonction de vos besoins et de votre domain model.

  16. #16
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    les tutoriels sont une chose, ils permettent de comprendre le problème et de savoir comment l'appréhender

    le forum en est un autre, il permet de confronter les idées, les témoignages et les expériences

    ici, la question est pourtant clair, et le sujet du post aussi
    la question s'adresse aux experts : comment mapper au mieux une relation de type 1:n

    ceux qui savent et qui ne viennent pas sur le forum pour dénigrer auront la générosité de répondre, et m'aideront à ne pas faire les erreurs qu'ils ont déjà pu commettre

    les autres n'ont rien à dire !! et probablement rien à faire non plus...

  17. #17
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Le probleme que je vois, c'est que ta question a changée, relis toi et tu verras que tu es passé d'une relation 1-n (pour laquelle je t'ai donné la solution) à 2 relations 1-1 (expliquée dans la doc).
    Le lien que j'ai donné n'est pas un tutorial, mais la doc officielle en francais.
    Quand à l'accusation de ne pas répondre aux questions, liste mes posts et lis les !
    Ma réponse s'adressait également à agougeon qui, je peux me tromper, cherchait des réponses sans s'etre vraiment intéressé à la doc et si tu relis ma derniere phrase :
    Les relations 1-n, 1-1, m-n sont expliquées, à vous de transposez tout ca dans votre contexte en fonction de vos besoins et de votre domain model.
    je pense que tu comprends mieux ce que j'ai voulu dire (tout dépend du contexte et il n'y a pas de réponse unique).

    PS : pour info, la réponse à ta question se trouve ici
    PPS : pour agougeon, les meilleurs pratiques sont listées dans la doc : http://www.hibernate.org/hib_docs/v3/reference/fr/html_single/#best-practices

  18. #18
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    pour revenir à nos moutons,

    si je fais 2 one-to-one, je vais générer 3 classes :
    client.java
    appel_client.java
    appel.java

    pourtant, à la base, j'ai modelisé 2 tables
    client contenant nom, adresse, etc...
    appel contenant raison, commentaire, date, etc...


    pour être concret,
    je n'aurais pas comme voulu les getters appel.getDate mais plutôt appel_client.getDate

    donc une classe supplémentaire,
    et là je trouve que c dommage
    lorsque je pense à ceux qui reprendront le code derrière moi et qui n'auront que le schéma de départ, je me dis que ce n'est pas assez intuitif

    donc ma question est:
    peux-t-on s'arranger pour ne récupérer que 2 classes comme prévue au départ:
    une pour client.java et une autre pour appel.java (plutôt que 3)

    merci

  19. #19
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par Néo-Tony
    pour revenir à nos moutons,

    si je fais 2 one-to-one, je vais générer 3 classes :
    client.java
    appel_client.java
    appel.java

    pourtant, à la base, j'ai modelisé 2 tables
    client contenant nom, adresse, etc...
    appel contenant raison, commentaire, date, etc...
    Tu n'es pas clair, combien de table as tu ? Tu disais 3 (c'est ce que j'ai cru comprendre) et tu parles de 2 maintenant.


    Citation Envoyé par Néo-Tony
    pour être concret,
    je n'aurais pas comme voulu les getters appel.getDate mais plutôt appel_client.getDate

    donc ma question est:
    peux-t-on s'arranger pour ne récupérer que 2 classes comme prévue au départ:
    une pour client.java et une autre pour appel.java (plutôt que 3)

    merci
    Ca ca va dépendre de ta base et de ton mapping et de la réponse à la question que je te pose

    Je viens de te relire et je vois ca :
    Citation Envoyé par Néo-Tony
    3 tables : client, appel et client_appel (car c'est une realtion du type 1:n)
    dans la bdd, j'ai nécessairement
    client -----1:1----- appel_ps -----1:1----- appel
    2 relations 1-1 ne font pas une relation 1-n (si c'est vraiment ton besoin)
    Je ne connais pas ton besoin, mais la table appel_ps est elle nécessaire s'il s'agit d'une relation 1-n (il ne s'agit pas d'une table de croisement comme pour une relation m-n) ? Explique un peu mieux ton besoin ou le contexte pour pouvoir etre aidé efficacement, je trouves que tu manques de clarté.

  20. #20
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 104
    Points : 44
    Points
    44
    Par défaut
    c vrai que c'est pas clair

    je vais contacter l'admin de la bdd et lui demander pourquoi il a créé une table appel_ps qui suggère dont un relation de type n:m
    alors que je ne vois à priori aucune raison

    je pense qu'une relation 1:n est largement conseillé
    merci en tout cas de ta patience et de ton implication
    affaire à suivre

Discussions similaires

  1. Question pour les experts
    Par Philippe66 dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 31/08/2006, 23h35
  2. Questions pour les encodages
    Par alfa88 dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 20/05/2006, 20h32
  3. Question pour les maitres du multithreading
    Par giova_fr dans le forum Windows
    Réponses: 20
    Dernier message: 20/12/2005, 16h18
  4. Réponses: 3
    Dernier message: 14/12/2005, 23h08
  5. Questions pour les developpeurs independants
    Par voyageur dans le forum Freelance
    Réponses: 5
    Dernier message: 22/06/2005, 11h33

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