У меня есть три класса сущностей; Student
, Subject
и StudentSubject
.
Student
имеет отношение один ко многим к StudentSubject
, а Subject
также имеет отношение один ко многим к StudentSubject
.
Студенческий класс
@Entity
@Getter
@Setter
public class Student {
@Id
private String email;
@OneToMany(mappedBy = "student")
@JsonManagedReference
private List<StudentSubject> subjects;
//more elements
}
Тематический класс
@Entity
@Getter
@Setter
public class Subject {
@Id
@GeneratedValue
private Long id;
@ManyToOne
@JsonBackReference
private Teacher teacher;
@OneToMany(mappedBy = "student")
@JsonManagedReference
private List<StudentSubject> students;
//more elements
}
Класс StudentSubject
@Entity
@IdClass(StudentSubjectId.class)
@Getter
@Setter
public class StudentSubject implements Serializable {
//Primary keys
@Id
@Column(name = "subject_id")
Long subjectId;
@Id
@Column(name = "student_email")
String studentEmail;
String uid;
@ManyToOne
@JsonBackReference
@JoinColumn(name = "subject_id", insertable = false, updatable = false)
private Subject subject;
@ManyToOne
@JsonBackReference
@JoinColumn(name = "student_email", insertable = false, updatable = false)
private Student student;
}
У меня 3 класса, а не 2, потому что есть атрибуты, характерные для каждой предметной пары ученика. Отсюда такая договоренность.
Когда я читаю тему из репозитория, как таковую
Subject subject = subjectRepository.findByNameAndTeacher(subjectName, teacher);
subject.getStudents();
все детали верны, кроме списка студентов. Он всегда пуст (проверено добавлением точки останова)
Запросы, которые выполняются Hibernate/JPA:
Чтобы получить тему (?)
select
subject0_.id as id1_3_,
subject0_.name as name2_3_,
subject0_.teacher_email as teacher_3_3_
from
subject subject0_
left outer join
teacher teacher1_
on subject0_.teacher_email = teacher1_.email
where
subject0_.name =?
and teacher1_.email =?
Чтобы выбрать список студентов (?)
select
students0_.student_email as student_1_2_0_,
students0_.subject_id as subject_2_2_0_,
students0_.student_email as student_1_2_1_,
students0_.subject_id as subject_2_2_1_,
students0_.uid as uid3_2_1_,
subject1_.id as id1_3_2_,
subject1_.name as name2_3_2_,
subject1_.teacher_email as teacher_3_3_2_,
teacher2_.email as email1_5_3_,
teacher2_.name as name2_5_3_
from
student_subject students0_
left outer join
subject subject1_
on students0_.subject_id = subject1_.id
left outer join
teacher teacher2_
on subject1_.teacher_email = teacher2_.email
where
students0_.student_email =?
и еще кое-что.
Я думаю, что проблема здесь в том, что последнее предложение where добавлено неправильно, и общие атрибуты в таблицах не отображаются ни разу. Как это исправить?