有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在JPA(Hibernate)中映射一对多关系和复合主键?

我的桌子是这样的:

School
-------
school_id (pk)
...

Student
school_id (pk) (fk)
student_id (pk)
...

因此,使用JPA(Hibernate),我尝试了类似的方法

@Entity
@Table("SCHOOL")
public School {
    @Column(name = "SCHOOL_ID")
    private String schoolId;
    
    @OneToMany
    private List<Student> students;
}

@Entity
@Table("STUDENT")
public Student {
    @EmbeddedId
    private StudentPK studentPK;

    @ManyToOne
    @JoinColumn(name = "SCHOOL_ID")
    private School school; 
}

@Embeddable
public StudentPK implements Serializable {
    @Column(name = "SCHOOL_ID")
    private String schoolId;

    @Column(name = "STUDENT_ID"
    private String studentId;
}

当我这样做时,我经常会收到一个错误,表明在运行时违反了外键约束。我怀疑JPA试图生成一个名为“SCHOOL_ID”的新外键,而不是使用我的组合键中的现有列,但我不确定如何强制它使用现有列


共 (1) 个答案

  1. # 1 楼答案

    这些关系的映射方式应该有所不同:

    @Entity
    @Table("SCHOOL")
    public School {
        @Column(name = "SCHOOL_ID")
        private String schoolId;
        
        @OneToMany(mappedBy="school")
        private List<Student> students;
    }
    
    @Entity
    @Table("STUDENT")
    public Student {
        @EmbeddedId
        private StudentPK studentPK;
    
        @ManyToOne
        @MapsId("schoolId")
        private School school; 
    }
    
    @Embeddable
    public StudentPK implements Serializable {
        @Column(name = "SCHOOL_ID")
        private String schoolId;
    
        @Column(name = "STUDENT_ID"
        private String studentId;
    }
    
    

    注意School.students上的@OneToMany.mappedBy属性和Student.school上的@MapsId注释

    第2.4.1节JPA 2.2 spec中讨论了派生恒等式(带有示例)