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)