【问题标题】:org.hibernate.MappingException: collection foreign key mapping has wrong number of columnsorg.hibernate.MappingException:集合外键映射的列数错误
【发布时间】:2018-01-15 15:26:11
【问题描述】:

我有这样的课程Subject

@Entity
@IdClass(SubjectId.class)
@Data
public class Subject {
    @Id
    private String name;
    @ManyToOne
    @JsonBackReference
    @Id
    private Teacher teacher;
    @OneToMany(mappedBy = "student")
    private List<StudentSubject> students;
}

它的复合 Id 是在 SubjectId 类中定义的,

public class SubjectId implements Serializable{
    private String name;
    private Teacher teacher;

    public SubjectId(String name, Teacher teacher) {
        this.name = name;
        this.teacher = teacher;
    }
    SubjectId(){}
}

编译时出现错误

org.hibernate.MappingException:集合外键映射的列数错误:com.example.Subject.students 类型:component[name,teacher]

虽然这将错误指向学生元素,但在我删除了自动生成的主题 ID 并将其替换为姓名和教师的组合后发生了错误。

无论如何,students 元素被映射到 StudentSubject 类中,

@Entity
@IdClass(StudentSubjectId.class)
public @Data
class StudentSubject {

    String studentId;
    @ManyToOne
    @Id
    private Subject subject;
    @ManyToOne
    @Id
    private Student student;

【问题讨论】:

  • 我从来没有做过多键值作为外键,但如果你在subject 中的@JoinColumns 上使用@JoinColumns 可能会起作用。
  • @coladict 成功了!但我不明白为什么这是 StudentSubject 实体的问题,而另一个实体(此处未提及)可以将两列都添加为外键。
  • 可能是因为Subject类有一个多键id,所以Hibernate不知道如何递归映射列。

标签: java hibernate


【解决方案1】:

发生此错误时,通常意味着 hibernate 在正确数量的列上映射外键时遇到问题。

在上述情况下,StudentSubject 类中的subject 实体没有映射到两列,即nameteacher_email(这是Teacher 表的主键)。

要修复此类错误,请添加@JoinColumns,如下所示

class StudentSubject {
    @Id
    @ManyToOne
    @JoinColumns({
            @JoinColumn(referencedColumnName = "name"),
            @JoinColumn(referencedColumnName = "teacher_email") })
    private Subject subject;
}

referencedColumnName 指外部表中列的名称。

【讨论】:

  • 但是如果我故意只想引用部分键(即不需要teacher_email)怎么办?我面临同样的问题,请你帮忙。 @注册用户
【解决方案2】:

尝试以这种方式设置 OneToMany:

 @OneToMany(
    cascade = CascadeType.ALL, 
    orphanRemoval = true)
    private List<StudentSubject> students = new ArrayList<>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多