Come posso creare un mapping Hibernate da molti a molti per ulteriori proprietà dalla tabella Join?

Ho bisogno di una mapping da molti a molti in letargo e sono necessari 3 join. Ho cercato di trovare una soluzione senza quadro intermedia come LecturerCourse .

Ho una relazione molti a molti nel mio database tra il mio docente e le tabelle dei corsi. Un corso può essere tenuto da diversi docenti mentre un docente può impartire diversi corsi.

Ho dei corsi archiviati in anticipo. Tuttavia, ho bisogno di assegnare corsi al docente. Quando assegno i corsi, memorizzo anche la capacità di quel corso.

Il mio diagramma di database:

inserisci la descrizione dell'immagine qui

Io uso l’ibernazione e la spring. Ho bisogno di una mapping in stato di ibernazione quando un corso è assegnato a un docente. Devo aggiungere valori al campo di capacità.

La mia docenza di 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", [email protected](name="LECTURER_ID"), [email protected](name="COURSE_ID") ) private List courses; //getters - setters } 

La mia mapping del corso:

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

Qualche idea su come risolvere il mio problema?

È necessario utilizzare le annotazioni @Embeddable e @Embeddable per risolvere questo problema:

Classe del docente:

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

Corso

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

Docente a lezione:

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

Ora la chiave primaria:

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

ora il tuo Main dovrebbe essere qualcosa del genere:

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

Devi essere sicuro che la class contrassegnata come @Embeddable dovrebbe implementare un’interfaccia marcatore Serializable .

Spero che sia d’aiuto.