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 - 休眠命名查询不知道错误

java - tycho-组装JAR时出错:zip文件无法包含自身-> [帮助1]

java - 在处理批注时如何写Gradle日志?

java - JPA事务不会回滚持久调用。仅在MySQL上插入并提交忽略事务规则

java - Bean创建异常,自动连接依赖项注入失败

java - 使用单表策略持久化休眠继承映射

java - 在单个数据中心内将蚁群优化添加为跨VM的负载平衡策略

java - Java-函数未返回我期望的结果

java - 无法让Spring注入我的依赖

java - 从服务类中调用Spring @Transactional时,此方法不适用于带注释的方法