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 ?
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.Envoyé par Néo-Tony
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
Classe Commentaire :
mapping de 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; } ...
Classe Client :
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
5
6
7
8
9
10 ... private Set commentaires; public Set getCommentaires() { return commentaires; } public void setCommentaires(Set s) { commentaires = s; } ...
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>
d'accord, je comprends mieux, merci pour ton aide![]()
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.
Ce n'est pas exact. Le comportement va dépendre des options de mapping (cf la doc).Envoyé par c4cf6
Je suis d'accord sur l'utilisation d'un DAO mais ils t'ont fait quoi les bags ?Envoyé par c4cf6
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.
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 ?
j'ai l'impression que la proposition de dlemoing ne permet pas de récupérer ces champsEnvoyé par dlemoing
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
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
![]()
![]()
![]()
![]()
![]()
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
appels.hbmet 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 <?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>je pense que c'est la meilleurs façon de mapper (la plus pure)
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>
mais de cette façon, je fais completement l'impasse sur la table client_appel
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.
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...
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 :
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).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.
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
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
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.Envoyé par Néo-Tony
Ca ca va dépendre de ta base et de ton mapping et de la réponse à la question que je te poseEnvoyé par Néo-Tony
Je viens de te relire et je vois ca :
2 relations 1-1 ne font pas une relation 1-n (si c'est vraiment ton besoin)Envoyé par Néo-Tony
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é.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager