首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA @ManyToOne两张桌子

JPA @ManyToOne两张桌子
EN

Stack Overflow用户
提问于 2018-07-04 11:14:09
回答 3查看 619关注 0票数 0

我有两张桌子学生和Student_Pseudo。

一个伪可以归因于一个或多个学生。

学生包含

代码语言:javascript
复制
* Student_code 
* Student_login 

Student_Pseudo包含

代码语言:javascript
复制
* Stu_code 
* Pseudo 

Stu_code是Student_code的外键

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

代码语言:javascript
复制
@ManyToOne(optional = false)
    @JoinColumn(name="STU_CODE", referencedColumnName="STUDENT_CODE", nullable=false)
    private Pseudo pseudo;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-05 10:09:53

我终于找到了基于@的解决方案。感谢大家的帮助。

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2018-07-04 13:29:13

嗯,这是个小转弯处,但这是我想到的第一件事,而且确实有效。您说需要获取学生伪码,因此在Set中添加了一个Student。它应该是一个EmbeddableCollection,因为我没有看到您在student_pseudo中引用任何主键。外键由父实体创建,您只需将其命名为JoinColumn即可。其他的都是多余的。

代码语言:javascript
复制
@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;

也许你的问题是去取它。

代码语言:javascript
复制
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()));

这给了

代码语言:javascript
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2018-07-04 17:19:25

假设Student_Pseudo是学生和伪学生之间的关系表,有多种方法可以做到这一点,但最简单的方法是:

代码语言:javascript
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51172321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档