如何在JPA中Map复合主键

dzhpxtsq  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(118)
  1. @Table(name = "student")
  2. public class Student {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.AUTO)
  5. @Column(name = "id")
  6. private long id;
  7. @Column(name = "roll_no", nullable = false)
  8. private long rollNo;
  9. @Column(name = "enrollment_no", nullable = false, unique = true)
  10. private String enrollmentNo;
  11. }
  12. @Entity
  13. @Table(name = "subject")
  14. public class Subject {
  15. @Id
  16. @GeneratedValue(strategy = GenerationType.AUTO)
  17. @Column(name = "id")
  18. private long id;
  19. @Column(name = "subject_code", nullable = false, unique = true)
  20. private String code;// course code
  21. }

我有以上两个班级。我想为下面的数据库表student_marks(student_id,marks_id,marks,passing_status)创建一个StudentMarks类;
我尝试了这个

  1. @Embeddable
  2. public class StudentMarksId implements Serializable {
  3. private Long studentId;
  4. private Long subjected;
  5. //getter and setter
  6. }
  7. @Entity
  8. @Table(name = "student_marks")
  9. public class StudentMarks implements Serializable {
  10. private static final long serialVersionUID = 4428298147790767663L;
  11. @EmbeddedId
  12. @Id
  13. @JoinColumns({
  14. @JoinColumn(name = "subject_id", referencedColumnName = "id"),
  15. @JoinColumn(name = "student_id", referencedColumnName = "id") })
  16. private StudentMarksId id;
  17. private List<Subject> subjects;
  18. private List<Student> students;
  19. @Column(name = "marks", nullable = false)
  20. private int marks;
  21. @Column(name = "passing_status", nullable = false)
  22. private String passingStatus;// pass or fail
  23. }```
  24. I want to map student and subjects to student_marks.
owfi6suc

owfi6suc1#

有几种方法可以Map这一点。一个是:

  1. public class StudentMarksId implements Serializable {
  2. private Long studentId;
  3. private Long subjected;
  4. //getter and setter
  5. }
  6. @Entity
  7. @Table(name = "student_marks")
  8. @IdClass(StudentMarksId.class)
  9. public class StudentMarks implements Serializable {
  10. private static final long serialVersionUID = 4428298147790767663L;
  11. @Id
  12. @ManyToOne
  13. @JoinColumn(name = "subject_id", referencedColumnName = "id")
  14. private Subject subject;
  15. @Id
  16. @ManyToOne
  17. @JoinColumn(name = "student_id", referencedColumnName = "id")
  18. private Student student;
  19. @Column(name = "marks", nullable = false)
  20. private int marks;
  21. @Column(name = "passing_status", nullable = false)
  22. private String passingStatus;// pass or fail
  23. }

另一种可能是将StudentMarksId也Map为实体中的嵌入式:

  1. @Embeddable
  2. public class StudentMarksId implements Serializable {
  3. private Long studentId;
  4. private Long subjected;
  5. //getter and setter
  6. }
  7. @Entity
  8. @Table(name = "student_marks")
  9. @IdClass(StudentMarksId.class)
  10. public class StudentMarks implements Serializable {
  11. private static final long serialVersionUID = 4428298147790767663L;
  12. @EmbeddedId
  13. private StudentMarksId id;
  14. @MapsId("subjected")
  15. @ManyToOne
  16. @JoinColumn(name = "subject_id", referencedColumnName = "id")
  17. private Subject subjects;
  18. @MapsId("studentId")
  19. @ManyToOne
  20. @JoinColumn(name = "student_id", referencedColumnName = "id")
  21. private Student student;
  22. @Column(name = "marks", nullable = false)
  23. private int marks;
  24. @Column(name = "passing_status", nullable = false)
  25. private String passingStatus;// pass or fail
  26. }
展开查看全部

相关问题