2010-02-10 8 views
3

Considérez ce simple schéma de base de données:Hibernate Mapping Grâce à une autre entité

User    Course    StudentCourse  Student 
+-------------+  +-------------+  +-------------+  +-------------+ 
| -user_id |1 *| -course_id |1 *| -course_id |* 1| -student_id | 
|    |---->| -user_id |---->| -student_id |---->|    | 
+-------------+  +-------------+  +-------------+  +-------------+ 

[1 *] = 1 to many relationship 

J'ai créé des entités pour l'utilisateur, Cours et objets de l'élève, et mettre en place les applications suivantes:

User -> Course - one to many 
Course -> Student - many to many 

En mes classes Java, je peux accéder aux cours d'un utilisateur en appelant user.getCourses() et je peux accéder à tous les étudiants dans un cours en appelant course.getStudents(). Je veux être en mesure de trouver tous les étudiants dans tous les cours enseignés par un utilisateur spécifique comme user.getCourse().getStudents(), mais parce que user.getCourses() renvoie Collection<Course> Je ne peux pas appeler course.getStudents() sur la collection. Comment dois-je l'implémenter avec Hibernate? Une requête nommée est-elle ma seule option?

Répondre

1

Je suppose que vous devez définir fetchType = EAGER dans Course, ce qui n'est pas vraiment une bonne idée, donc HQL serait meilleur et efficace.

0

Vous pouvez effectuer les opérations suivantes:

List<Student> students = new ArrayList<Student>(); 
for (Course course : user.getCourses()) 
{ 
    students.addAll(course.getStudents()); 
} 

Toutefois, ce serait très inefficace (voir le problème « SELECT N+1 »)

Je n'ai pas eu la chance de le tester, mais votre requête nommée devrait être juste quelque chose comme: "SELECT c.students DE cours c OÙ c.user.name = 'nom d'utilisateur'"

0

Vous avez dit

Je veux être en mesure de trouver tous les étudiants dans tous les cours enseignés par un utilisateur spécifique

Utilisez HQL requête

SELECT DISTINCT _student FROM User AS _user, IN (_user.courses) _course, IN(_course.students) _student WHERE _user.id = :id 

ou

SELECT DISTINCT _student FROM User _user inner join _user.courses _course inner join _course.students _student WHERE _user.id = :id 

salutations,

Questions connexes