2 votes

Comment interroger un tableau ManyToMany à l'aide de Play, MySQL et Hibernate ?

Je suis nouveau à Play et Hibernate et je travaille sur un projet. Jusqu'à présent, j'adore !

J'ai rencontré un nouveau problème récemment. J'ai un tableau de personnes. J'ai ensuite une relation ManyToMany dans cette classe qui se référence elle-même. Hibernate crée donc cette table sans problème et j'ai peopleid1 et peopleid2 et les personnes peuvent avoir des relations avec toutes sortes d'autres personnes et vice versa.

J'ai maintenant besoin d'exécuter des requêtes complexes sur cette table et j'ai quelques problèmes car je veux en faire une classe à part entière mais je ne sais pas si c'est la meilleure façon de procéder ou si l'utilisation d'hibernate l'est. Est-ce que JPQL est la solution ? Toute aide ou réflexion est la bienvenue !

Prenons l'exemple des cousins. J'ai une classe/modèle Personne et ces personnes ont des cousins et peuvent être cousins. Pour l'instant, j'ai ceci dans mon code :

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "Cousins",
   joinColumns = { @JoinColumn(name = "personid") },
   inverseJoinColumns = { @JoinColumn(name = "cousinid") })
public Set<User> cousins;

Cela fonctionne très bien et crée la table de jonction parfaitement et je peux entrer des données et autres comme prévu. Cependant, je suis bloqué en essayant d'écrire une fonction. Je peux trouver toutes les personnes dont une personne connectée a un cousin, mais je ne peux pas trouver toutes les personnes dont l'utilisateur connecté est un cousin. Je pense que c'est la bonne façon de faire, mais je suis très enclin à faire de Cousins une classe/modèle à part entière et lorsque je fais cela, les choses fonctionnent mais je ne suis pas sûr de la façon dont Hibernate gérera les relations alors.

1voto

JB Nizet Points 250258

La relation de cousinage est un peu étrange parce qu'elle est purement symétrique : si A est un cousin de B, alors B est également un cousin de A.

Cela diffère d'une relation classique entre l'étudiant et le cours, où chaque partie de la relation a un rôle différent.

Vous devez toutefois considérer la relation de cousinage comme une relation rôleA-rôleB. Vous pourriez la définir comme suit : personne-cousin personId désigne la personne et cousinId désigne le cousin. Ainsi, si vous voulez dire que la personne A a un cousin B, vous devez avoir un tuple aId-bId dans la table de jointure. Si vous voulez également dire que la personne B a le cousin A, vous devez avoir un tuple bId-aId dans la table de jointure.

Le HQL pour trouver tous les cousins d'une personne est donc le suivant :

 select cousin from People person inner join person.cousins cousin where person.id = :personId

Le HQL pour trouver toutes les personnes d'un cousin est celui-ci :

select person from People person inner join person.cousins cousin where cousin.id = :cousinId

Pensez en termes de rôles plutôt qu'en termes de table, et cela deviendra beaucoup plus facile. Penser à un cousin comme à un enfant et à une personne comme à un parent est peut-être une bonne idée, car cela rend l'association asymétrique et les rôles plus évidents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X