JPA @ManyToOne Two Tables - PullRequest
       8

JPA @ManyToOne Two Tables

0 голосов
/ 04 июля 2018

У меня есть два стола Student и Student_Pseudo.
Псевдо можно отнести к одному или нескольким ученикам.

Студент содержит

* Student_code 
* Student_login 

Student_Pseudo содержит

* Stu_code 
* Pseudo 

Stu_code является внешним ключом Student_code

Я хочу получить псевдо в Student Entity, используя отношение @ManyToOne, и оно не работает

@ManyToOne(optional = false)
    @JoinColumn(name="STU_CODE", referencedColumnName="STUDENT_CODE", nullable=false)
    private Pseudo pseudo;

Псевдо всегда ноль, когда я получаю студентов !!!

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Предполагая, что Student_Pseudo является таблицей отношений между Student и Pseudo, существует несколько способов сделать это, но самый простой из них будет:

@ManyToOne(optional = false)
@JoinTable(
    name = "Student_Pseudo", 
    joinColumns = @JoinColumn(name = "PSEUDO"), 
    inverseJoinColumns = @JoinColumn(name="STU_CODE", referencedColumnName="STUDENT_CODE", nullable=false))
private Pseudo pseudo;
0 голосов
/ 05 июля 2018

Я наконец нашел решение, основанное на ответе @Chris. Спасибо всем за помощь.

@ManyToOne(optional = false)
    @JoinTable(
        name = "Student_Pseudo", 
        joinColumns = @JoinColumn(name = "STU_CODE", nullable=false), 
        inverseJoinColumns = @JoinColumn(name="STU_CODE", nullable=false))
private Pseudo pseudo;
0 голосов
/ 04 июля 2018

Ну, это немного окольным путем, но это первое, о чем я подумал, и оно работает. Вы сказали, что вам нужно получить псевдоисточник, поэтому для этого добавляется 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]
...