java - 如何让jpa hibernate创建具有多对一但没有外键的实体

标签 java spring hibernate jpa orm

我有两个具有多对一关系的表,但它们没有外键。 像 Student 有很多,而 Teacher 就是一个,

实体例如:

@Entity
@Table(name = "student")
class Student {


   @Column(name = "TeacherName")
   private String teacherName;

   @ManyToOne
   private Teacher teacher
}


@Entity
@Table(name = "teacher")
class Teacher {

 private String name;
}

当我查询学生时,sql是:

select * from Student as st INNER JOIN Teacher as tcr ON st.TeacherName = tcr.name;

我发现 @ManyToOne 不能工作,看起来它需要一个外键。虽然该表无法提供此类信息。

谁能告诉我如何配置实体?

最佳答案

您必须使用以下映射:

public class Teacher  {

    @OneToMany(mappedBy = "teacher")
    private Set<Student> students;

    @Column(name = "name")
    private String name;
}

public class Student {
    @ManyToOne
    @JoinColumn(name = "teacherName", referencedColumnName = "name")
    private Teacher teacher;

}

然后在 HQL 中:

select s from Student s INNER JOIN s.teacher t where t.name = :name 

或者 如果您想保留当前的映射,则需要在 hql 中使用“旧”样式的连接来实现非外键列的连接:

select s from Student s, Teacher t where t.name = s.teacherName and t.name = :name

关于java - 如何让jpa hibernate创建具有多对一但没有外键的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42106500/

相关文章:

java - 解释大 O 循环和数组

java - 使用 XML 进行改造 - 元素在类中没有匹配项

java - 从任何 Activity 访问 int

Spring Boot安全配置忽略允许的端点

Spring MVC数据库展示

hibernate - Grails 2.0 中的 MappedSuperclass 替代方案

java - 合并 BG 为 JPEG 的图像会导致意外结果

java - JPA Web 应用程序管理策略

java - 如何统计HQL中的子查询?

spring - Thymeleaf 布局方言错误 TemplateProcessingException : No Standard Expression Parser has been registered as an execution argument