如何从联接表中为其他属性创建多对多 Hibernate Mapping?

我需要多对多的hibernatemapping,需要3个联接。我试图找出没有像这样的中间实体的解决方案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注释来解决此问题:

讲师班:

@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标记接口。

希望能帮助到你。

以上是 如何从联接表中为其他属性创建多对多 Hibernate Mapping? 的全部内容, 来源链接: utcz.com/qa/399520.html

回到顶部