如何从连接表创build多个到多个Hibernate映射的附加属性?

我需要一个多对多的Hibernate映射,需要3个连接。 我试图find一个没有像LecturerCourse这样的中间实体的解决scheme。

在我的讲师和课程表之间,我的数据库中有很多关系。 一个讲座可以由几个讲师给,而讲师可以给几个课程。

我有课前存储的课程。 但是,我需要给讲师分配课程。 当我分配课程时,我也储存了这门课程的能力。

我的数据库图表:

在这里输入图像描述

我用冬眠和spring。 当课程分配任何讲师时,我需要一个hibernate映射。 我需要为容量字段添加值。

我的讲师映射:

 @Entity @Table(name="LECTURER") public class Lecturer { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ") @SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ") private Long Id; @Column(name="NAME") private String name; @Column(name="SURNAME") private String surname; @Column(name="EMAIL") private String email; @Column(name="USERNAME") private String username; @Column(name="PASSWORD") private String Password; @ManyToMany @JoinTable( name="LECTURER_COURSE", joinColumns=@JoinColumn(name="LECTURER_ID"), inverseJoinColumns=@JoinColumn(name="COURSE_ID") ) private List<Course> courses; //getters - setters } 

我的课程地图:

 @Entity @Table(name="COURSE") public class Course { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ") @SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ") private Long id; @Column(name="NAME") private String name; @Column(name="CODE") private String code; } 

任何想法如何解决我的问题?

你需要使用@EmbeddedId@Embeddable注解来解决这个问题:

讲师class级:

 @Entity @Table(name="LECTURER") public class Lecturer { @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL) Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); //all others properties Setters and getters are less relevant. } 

课程等级:

 @Entity @Table(name="COURSE") public class Course { @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL) Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); //all others properties Setters and getters are less relevant. } 

讲师课程类别:

 @Entity @Table(name = "lecturer_course") @AssociationOverrides({ @AssociationOverride(name = "pk.lecturer", joinColumns = @JoinColumn(name = "LECTURER_ID")), @AssociationOverride(name = "pk.course", joinColumns = @JoinColumn(name = "COURSE_ID")) }) public class LecturerCourse { private LecturerCourseID pk = new LecturerCourseID(); @Column(name = "CAPACITY", nullable = false, length = 10) private String capacity; @EmbeddedId public LecturerCourseID getPk() { return pk; } } 

现在主键:

 @Embeddable public class LecturerCourseID implements java.io.Serializable { private Lecturer lecturer; private Course course; @ManyToOne public Stock getLecturer() { return lecturer; } public void setLecturer(Lecturer lecturer) { this.lecturer= lecturer; } @ManyToOne public Course getCourse() { return course; } public void setCourse(Course course) { this.course= course; } } 

现在你的主要应该是这样的:

 Lecturer lecturer1 = new Lecturer(); Course math = new Course(); LecturerCourse lecturer1math = new LecturerCourse(); lecturer1math.setCapacity("capacity"); lecturer1math.setLecturer(lecturer1); lecturer1math.setCourse(math); lecturer1.getLecturerCourses().add(lecturer1math); //saving object session.save(lecturer1); 

您需要确保标记为@Embeddable类应该实现Serializable标记接口。

希望它有帮助。