Java 如何在JPA(Hibernate)中映射一对多关系和复合主键?
我的桌子是这样的:Java 如何在JPA(Hibernate)中映射一对多关系和复合主键?,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我的桌子是这样的: 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;
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;
}
@实体
@表(“学校”)
公立学校{
@列(name=“SCHOOL\u ID”)
私人字符串学校ID;
@独身癖
私人名单学生;
}
@实体
@表(“学生”)
公立学生{
@嵌入ID
私人学生PK学生PK;
@许多酮
@JoinColumn(name=“SCHOOL\u ID”)
私立学校;
}
@可嵌入
public StudentPK实现可序列化{
@列(name=“SCHOOL\u ID”)
私人字符串学校ID;
@列(name=“STUDENT\u ID”
私人字符串学生ID;
}
当我这样做时,我经常会收到一个错误,说在运行时违反了外键约束。我怀疑JPA正在试图生成一个名为“SCHOOL_ID”的新外键而不是使用组合键中的现有列,但我不确定如何强制它使用现有列。这些关系的映射方式应该有所不同:
@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;
}
@实体
@表(“学校”)
公立学校{
@列(name=“SCHOOL\u ID”)
私人字符串学校ID;
@OneToMany(mappedBy=“学校”)
私人名单学生;
}
@实体
@表(“学生”)
公立学生{
@嵌入ID
私人学生PK学生PK;
@许多酮
@MapsId(“学校ID”)
私立学校;
}
@可嵌入
public StudentPK实现可序列化{
@列(name=“SCHOOL\u ID”)
私人字符串学校ID;
@列(name=“STUDENT\u ID”
私人字符串学生ID;
}
请注意School.students
上的@OneToMany.mappedBy
属性和Student.School
上的@MapsId
注释
讨论了派生恒等式(附示例)在第2.4.1节中。学校实体上的@Id注释在哪里?另外,您可以发布错误stacktrace吗?错误发生在哪个操作中?这条评论让我了解了大部分情况。原来我以前偶然发现了这个解决方案,但它仍然不起作用,因为h2嵌入式数据库是自动生成的正在使用整数而不是字符串生成数据库架构。