Prova questo:
public class Professor {
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "ALUNO_PROFESSOR",
joinColumns = @JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor"),
inverseJoinColumns = @JoinColumn(name = "idAluno", referencedColumnName = "idAluno"))
private List<Aluno> alunoList;
}
public class Aluno {
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "ALUNO_PROFESSOR",
joinColumns = @JoinColumn(name = "idAluno", referencedColumnName = "idAluno"),
inverseJoinColumns = @JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor"))
private List<Professor> professorList;
}
Ciò garantirà che i metadati per la relazione molti-a-molti siano disponibili su entrambe le entità e che le operazioni su entrambi i lati della relazione siano sovrapposte all'altro lato.
Suggerisco anche di sostituire FetchType.EAGER
con FetchType.LAZY
per prestazioni migliori perché questo ha il potenziale di caricare un set di dati molto grande.