Skip to content

Relations ManyToOne

hittepit edited this page Mar 18, 2014 · 3 revisions

L'objectif ici est de montrer que la relation ManyToOne est suffisante, sans qu'il soit nécessaire de créer une relation bidirectionnelle.

Le cas représenté ici est le lien entre un employeur et un travailleur. Dans ce cas de figure, le travailleur a un seul employeur, l'employeur ayant plusieurs travailleurs.

Néanmoins, seule la relation de travailleur vers employeur existe dans le modèle objet.

Recupération de la liste des travailleurs

Un objection que j'entends en effet souvent est qu'il n'y aura pas moyen de retrouver les travailleurs d'un employeur donné.

La preuve que c'est possible est données dans les méthodes testFindOneToMany1, testFindOneToMany2, testFindOneToMany3 du test be.fabrice.manyToOne.TestFindTravailleurs.

Pour un objet employeur donné, la liste de ses travailleurs se trouve avec la requête hql suivante: from Travailleur t where t.employeur = :e où "e" doit être injecté avec setParameter("e", employeur).

Join avec un select

Lors de la récupération d'un travailleur, par défaut, Hibernate fera un left outer join: select travailleu0_.ID as ID1_1_, travailleu0_.EMP_ID as EMP3_1_1_, travailleu0_.EMP_2_ID as EMP4_1_1_, travailleu0_.NOM as NOM1_1_, employeur1_.ID as ID0_0_, employeur1_.NOM as NOM0_0_ from TRAV travailleu0_ left outer join EMP employeur1_ on travailleu0_.EMP_ID=employeur1_.ID where travailleu0_.ID=2000

En général, c'est suffisant. Cependant, il est parfois plus performant d'effectuer la récupération de la relation ManyToOne dans un select séparé. C'est ce qui est fait dans le mapping (propriété employeurWithSelect, annotée @Fetch(FetchMode.SELECT)

La méthode testFindTravailleurUsesJoinByDefautButMayUseSelect permet de visualiser l'effet sur les requêtes, à condition d'aller voir les logs.

Clone this wiki locally