我需要多对多的hibernate mapping,需要3个联接。我试图找出没有像这样的中间实体的解决方案LecturerCourse。
LecturerCourse
我的讲师和课程表之间的数据库之间存在多对多关系。一门课程可以由多位讲师授课,而一位讲师可以提供多门课程。
我有预先存储的课程。但是,我需要将课程分配给讲师。分配课程时,我还会存储该课程的容量。
我的数据库图:
我使用hibernate and spring。当课程分配任何讲师时,我需要一个hibernate mapping。我需要向容量字段添加值。
My lecturer mapping :
@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 }
My course mapping :
@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注释来解决此问题:
@EmbeddedId
@Embeddable
讲师班:
@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; } }
现在,你的Main应该是这样的:
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标记接口。
Serializable
希望能帮助到你。