Java JPA@ManyToOne两张表

Java JPA@ManyToOne两张表,java,eclipselink,jpa-2.0,Java,Eclipselink,Jpa 2.0,我有两张学生桌和学生桌 可以为一个或多个学生归因于伪错误 学生包含 * Student_code * Student_login * Stu_code * Pseudo 学生公寓 * Student_code * Student_login * Stu_code * Pseudo Stu_代码是Student_代码的外键 我想在学生实体中使用@ManyToOne关系获取Pseudo,但它不起作用 @ManyToOne(optional = false) @Join

我有两张学生桌和学生桌
可以为一个或多个学生归因于伪错误

学生包含

* Student_code 
* Student_login 
* Stu_code 
* Pseudo 
学生公寓

* Student_code 
* Student_login 
* Stu_code 
* Pseudo 
Stu_代码是Student_代码的外键

我想在学生实体中使用@ManyToOne关系获取Pseudo,但它不起作用

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

当我得到学生时,伪码总是空的

嗯,这有点迂回,但这是我想到的第一件事,而且确实管用。您说过需要获取学生伪码,因此在
student
中添加了一个
Set
。它应该是一个
embeddedableCollection
,因为我看不到您在student\u 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;

假设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;

我终于找到了基于@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;

您的映射(或描述)错误:Student中的join列命名为Student_CODE,而不是STU_CODE。它在伪表中引用的列名为STU_CODE,而不是STUDENT_CODE。首先为什么命名不一致?你让你自己的生活变得更加困难。谢谢你的回复。项目中的表很旧,我无法更改它们。你的意思是我应该把name=“STUDENT_CODE”,referencedColumnName=“STU_CODE”?是的,这就是我的意思。我这样做有一个错误堆栈。@Samy请用这个错误更新你的问题谢谢你的回答。一个学生只能有一个伪学生,多个学生可以有同一个伪学生。你认为收藏是解决问题的办法吗?Student_pseudo中的主键是约束“Student_pseudo_PK”主键(“STU_代码”、“pseudo”),您可以使用实体来实现这一点。你应该把你的问题弄清楚,你有什么问题,没有什么问题。例如,我需要的是,如果我有3个学生,分别有学生代码(1,2,3)和学生登录名(St_1,St_2,St_3)。假设学生1和2具有相同的伪“PST”。在表Student_pseudo中,我将有两个值[Stu_code=1,pseudo='PST'],[Stu_code=2,pseudo='PST']。我需要的是,当我加载学生时,我希望在实体学生中有一个属性pseudo,对于St_1和St_2的值为“PST”,对于St_3的值为(null)