# Java > Gnral Java > Persistance des donnes >  One-to-many et many-to-one

## Colargole

Hello,

Je fais suite  un topic que je ne retrouve plus.

En fait j'essaie de coder une relation many-to-one mais je patine dans la s'moule.

Dj, malgr une solide formation et lecture de la section idoine de la doc Hibernate, je ne comprends pas la diffrence entre une relation many-to-one (recommand) et une one-to-many ("inhabituel et pas recommand")

La one-to-many est lie troitement au concept de collection, or pourquoi pas la many-to-one ? Niveau objet, dans tous les cas il faudra bien dire que A est un ensemble de B notamment si plusieurs B sont rattachs  un A (many-to-one ?)

Si vous avez des exemples ce serait sympa car la doc Hibernate n'est pas trs causante en cas concrets. 

http://www.hibernate.org/hib_docs/re..._reference.pdf

(Chapitre 7 - p92)

Merci.

----------


## fr1man

Quel est exactement ton problme ?
Le many-to-one reprsente l'autre ct de la relation one-to-many.
Je n'ai pas eu de problme en me basant sur les exemples de la documentation.

----------


## Colargole

Rsumons donc la situation point par point :

*Classes*

J'ai cr une classe Forum et une classe Topic
A un Forum sont associs 0  n Topics.

*Attributs de classes*

J'ai cr ma classe Forum avec attribut de la cl primaire for_id
J'ai cr ma classe Topic avec top_id (correspond a cl primaire) et for_id (correspond  cl trangre)

*Getters setters et constructeurs*

J'ai les getters et les setters de tous les champs. Pas d'attributs relatifs aux cls primaires dans les constructeurs.

*Fichiers de mapping*

J'ai un id name le hbm du forum



```

```

J'ai un id name et un many-to-one dans le hbm du topic



```

```

*Mthodes*

Dans ma classe Forum j'ai une mthode ajouter Forum et une mthode ajouterTopic qui ouvrent bien des sessionFactory en appelant HibernateUtil, beginTransaction, persist et commit

*Main*

Le main consiste en :



```

```

*Execution / commentaires*

Le 1) fonctionne nickel et ajoute bien mon enreg dans MySQL
Le 2) plante avec ces Exceptions Hibernate :

_object is not an instance of declaring class
occurred calling getter of ...Forum.for_id_

Le 2) fonctionne en remplaant le <many-to-one> par <property name>

Rien de mieux avec un cascade="all" dans le many-to-one.

S'il faut un "one-to-many" dans Forum je ne comprends pas pourquoi en tous cas je n'ai pas vu cela en formation et la doc Hibernate dconseille l'usage de one-to-many pour une raison qui m'chappe.

Merci pour votre attention.

----------


## fr1man

Montre nous le code des mthodes ajouterForum et ajouterTopic et le code d'initialisation de ces objets.

Tu dois effectivement utiliser un many-to-one ct topic.

Le truc qui me gne, c'est qu'on parle pas de clef primaire cot Java avec Hibernate, on manipule des objets.
Ce qui donnerait :


```

```

----------


## Colargole

Forum.ajouterForum:



```

```

Forum.ajouterTopic :



```

```


Les constructeurs initialisent tous les attributs saufs ceux qui sont relatifs aux cls primaires car elles sont en auto-incrment, impossible donc les passer en argument on ne sait pas  l'avance ce que a vaut !

Exemple :



```
Public Forum (String for_libelle, ...)
```

et non 



```
Public Forum (int for_id, String Libelle, ...)
```

----------


## Colargole

Forum.ajouterForum:



```

```

Forum.ajouterTopic :



```

```


Les constructeurs initialisent tous les attributs saufs ceux qui sont relatifs aux cls primaires car elles sont en auto-incrment, impossible donc les passer en argument on ne sait pas  l'avance ce que a vaut !

Exemple :



```
Public Forum (String for_libelle, ...)
```

et non 



```
Public Forum (int for_id, String for_libelle, ...)
```

----------


## Colargole

Je prcise que si j'ai dj 2 topics dans ma table topic, l'appel de ajouterTopic donne bien, juste aprs le persist, visualis avec "inspect" en mode debug :

t.top_id=3

mais le commit plante.

----------


## Colargole

...Aprs avoir lu diffrents tutoriaux je n'ai toujours pas compris la diffrence entre ces 2 relations uni-directionnelles :

1) Crer une relation one-to-many dans Forum et une collection de Topics dfinie dans la classe Forum (aucune cl trangre)

2) Crer une relation many-to-one dans Topic avec une cl trangre dans Topic (aucune collection)

J'ai toutefois compris que l'utilisation conjointe de one-to-many et many-to-one s'applique aux relations bi-directionnelles, ce qui n'est pas notre cas ici.

Dans un tutoriel ils citent comme exemple 

pour le 1) la relation livre - chapitre 
pour le 2) la relation diteur - livre

Merci de bien vouloir m'expliquer...

----------


## fr1man

Les deux cas ncessitent quoi qu'il arrive une cl trangre en base; Hibernate n'est pas magique.

Tout dpend de ton besoin pour choisir ta relation.
Si tu as besoin d'avoir,  partir d'un forum, la liste de ses topics, utilise la premire solution.
S'il te suffit d'avoir le forum associ  un topic, choisis la deuxime.
Si tu as besoin des deux, fais une relation bi-directionnelle.
Hibernate recommande d'ailleurs l'utilisation de relation bi-directionnelle, pour, entre autre, une meilleure navigation dans les relations, dans les requtes HQL.

----------


## Colargole

Merci pour ton explication claire et prcise.

J'ai rsolu mon problme notamment avec ce tutoriel :

http://mars.iti.pk.edu.pl/~swoosh/_hibernate_tutorial/

Au Chapitre 4, page 2, le "private Publisher publisher" en gras m'a fait comprendre qu'il fallait rfrencer un objet et non un ID comme j'avais cod au dbut, avec le lot d'erreurs qui s'ensuit...

Pour complter et clore ce topic je prcise que pour que Hibernate charge en mmoire le forum pour un topic donn il faut prciser 

lazy="false"

dans le <many-to-one> et

fetch="join"

pour que le chargement se fasse en un seul SELECT 

Ces options se retrouvent de l'autre ct dans le one-to-many.

Le tutoriel ci-dessus explique bien tout cela

----------


## roje.roje

Bonjour,

j'ai un problme similaire avec hibernate...
ton lien vers le tutoriel semble ne pas fonctionner... est-ce que tu pourrais le mettre  jour ? 

merci beaucoup.

----------


## hellalaboy

Je relance la discussion suite  une remarque que j ai fait.
daprs *fr1man*:l'utilisation de la relation one to many dpend de l'objectif final de l'application.or je crois que en utilisant seulement une relation many to one on peut avoir soit la liste des topic a partir d un forum ou bien le topic associ a chaque forum.Ceci est faisable videment  travers une requte imbrique.
Donc,je ne vois pas ou est la force d'utilisation d une relation one to many

----------


## fr1man

C'est juste une question de facilit de navigation selon les besoins.

----------

