首页 > 解决方案 > 休眠关系在注释方式上找不到外键

问题描述

我是新来的休眠尝试精益休眠关系并有拖车表,关系是一对多

  create table student(
    id bigint primary key auto_increment,
    name varchar(20),
    student_class_id bigint foreign key references student_class(id)
  )

  create table student_class(
    id bigint primary key auto_increment,
    name varchar(20)
  )

spring sessionFactory bean 已配置 packageToScan 实体

这是实体类:

@Table(name = "students")
@Entity
public class Student {
    private Integer id;
    private Integer name;
    private StudentClass studentClass;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "name")
    public Integer getName() {
        return name;
    }

    public void setName(Integer name) {
        this.name = name;
    }

    @OneToOne
    @JoinColumn(name = "student_class_id")
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    public StudentClass getStudentClass() {
        return studentClass;
    }
    // setter getter
}


@Entity
@Table(name = "student_class")
public class StudentClass {
    private Integer id;
    private String name;
    private Set<Student> students = new HashSet<Student>();

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @OneToMany(mappedBy = "studentClass", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
    public Set<Student> getStudents() {
        return students;
    }
    /setter getter
}

sql是:select sc.name from StudentClass sc left join Student s on sc.id = s.student_class_id

和junit测试发现错误

[DEBUG] 2018-05-26 11:59:39.993 [main] HqlSqlBaseWalker - select << begin [level=1, statement=select]
[DEBUG] 2018-05-26 11:59:40.005 [main] FromElement - FromClause{level=1} : com.f.pojo.StudentClass (sc) -> studentcla0_
[DEBUG] 2018-05-26 11:59:40.009 [main] HqlSqlWalker - Creating entity-join FromElement [s -> com.f.pojo.Student]
[DEBUG] 2018-05-26 11:59:40.010 [main] FromElement - FromClause{level=1} : com.f.pojo.Student (s) -> student1_
[DEBUG] 2018-05-26 11:59:40.012 [main] FromReferenceNode - Resolved : sc -> studentcla0_.id
[DEBUG] 2018-05-26 11:59:40.013 [main] DotNode - getDataType() : id -> org.hibernate.type.IntegerType@26a2f7f9
[DEBUG] 2018-05-26 11:59:40.013 [main] FromReferenceNode - Resolved : sc.id -> studentcla0_.id
[DEBUG] 2018-05-26 11:59:40.013 [main] FromReferenceNode - Resolved : s -> student1_.id
[ERROR] 2018-05-26 11:59:40.016 [main] ErrorTracker -  could not resolve property: student_class_id of: com.f.pojo.Student
[ERROR] 2018-05-26 11:59:40.016 [main] ErrorTracker -  could not resolve property: student_class_id of: com.f.pojo.Studentcker -  could not resolve property: student_class_id of: com.f.pojo.Student
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: could not resolve property: student_class_id of: com.f.pojo.Student [select sc.name from com.f.pojo.StudentClass sc left join com.f.pojo.Student s on sc.id = s.student_class_id]

我是两个实体关系好像是对的,学生实体使用studentClass属性引用studentClass实体

标签: javasqlspringhibernate

解决方案


你的 SQL:

create table student(

你的班:

@Table(name = "students")

这些名称需要匹配。即使是单个字符也会产生很大的不同。

SQL 中的另一个问题:

name varchar(20),

你的班:

private Integer name;

类型也需要匹配。我相信您的意思是在您的课程中使用 String 而不是 Integer。


推荐阅读