Ну, это немного окольным путем, но это первое, о чем я подумал, и оно работает. Вы сказали, что вам нужно получить псевдоисточник, поэтому для этого добавляется Set
в Student
. Это должен быть EmbeddableCollection
, потому что я не вижу ссылки на первичный ключ в student_pseudo. Внешний ключ создается родительским объектом, и вам просто нужно присвоить ему имя JoinColumn
. Все остальное избыточно.
@Entity
public class Student {
@Id private int studentCode;
private String studentLogin;
@ElementCollection(targetClass=StudentPseudo.class)
@CollectionTable(joinColumns={@JoinColumn(name="stu_code")})
private Set<StudentPseudo> pseudos = new HashSet<>();
@Embeddable
public class StudentPseudo {
private String pseudo;
и, возможно, ваша проблема в получении этого.
tx.begin();
Student student = new Student();
student.setStudentCode(1);
StudentPseudo studentPseudo1 = new StudentPseudo();
studentPseudo1.setPseudo("ps1");
student.getPseudos().add(studentPseudo1);
StudentPseudo studentPseudo2 = new StudentPseudo();
studentPseudo2.setPseudo("ps2");
student.getPseudos().add(studentPseudo2);
em.persist(student);
tx.commit();
em.clear();
List<Student> rl = em.createQuery("select distinct s from Student s left join fetch s.pseudos", Student.class).getResultList();
System.out.println(rl.get(0) + Arrays.toString(rl.get(0).getPseudos().toArray()));
и это дает
Hibernate: select distinct student0_.studentCode as studentC1_1_, student0_.studentLogin as studentL2_1_, pseudos1_.stu_code as stu_code1_2_0__, pseudos1_.pseudo as pseudo2_2_0__ from Student student0_ left outer join Student_pseudos pseudos1_ on student0_.studentCode=pseudos1_.stu_code
model.Student@2e380628[model.StudentPseudo@2b8bd14b, model.StudentPseudo@5f13be1]