/ / Comment créer un mappage de plusieurs à plusieurs Hibernate pour des propriétés supplémentaires à partir de la table de jointure? - cartographie de printemps, d'hibernation, d'hibernation

Comment créer plusieurs mappages Hibernate pour des propriétés supplémentaires à partir de la table de jointure? - cartographie de printemps, d'hibernation, d'hibernation

J'ai besoin d'un plusieurs à plusieurs mappages d'hibernation nécessaires 3 jointures. J'ai essayé de trouver une solution sans entité intermédiaire comme LecturerCourse.

J'ai une relation plusieurs à plusieurs dans ma base de données entre mon professeur et les tables de cours. Un cours peut être donné par plusieurs conférenciers tandis qu'un conférencier peut donner plusieurs cours.

J'ai des cours stockés à l'avance. Cependant, je dois attribuer des cours au conférencier. Lorsque j'attribue des cours, je stocke également la capacité de ce cours.

Mon diagramme de base de données:

entrer la description de l'image ici

J'utilise l'hibernation et le printemps. J'ai besoin d'une cartographie d'hibernation lorsqu'un cours est attribué à un conférencier. J'ai besoin d'ajouter des valeurs au champ de capacité.

Ma cartographie de conférencier:

@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
}

Ma cartographie de cours:

@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;
}

Une idée comment résoudre mon problème?

Réponses:

27 pour la réponse № 1

Vous devez utiliser @EmbeddedId et @Embeddable annotations pour résoudre ce problème:

Classe de conférencier:

@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.

}

Cours:

@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.

}

Classe de cours:

@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;
}

}

Maintenant la clé primaire:

@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;
}

}

maintenant votre Main devrait être quelque chose comme ceci:

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);

Vous devez vous assurer que la classe marquée comme @Embeddable devrait mettre en œuvre Serializable interface de marqueur.

J'espère que cela aide.