2012-04-24 6 views
17

Ho bisogno di una mappatura da molti a molti in attesa di 3 join. Ho cercato di trovare una soluzione senza entità intermedia come LecturerCourse.Come si crea un mapping di sospensione da molti a molti per ulteriori proprietà dalla tabella di join?

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 memorizzati in anticipo. Tuttavia, ho bisogno di assegnare corsi al docente. Quando assegno i corsi, memorizzo anche la capacità di quel corso.

mio diagramma di database:

enter image description here

Io uso Hibernate e la primavera. Ho bisogno di una mappatura in stato di ibernazione quando un corso è assegnato a un docente. Devo aggiungere valori al campo di capacità.

mio docente mappatura:

@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<Course> courses; 

    //getters - setters 
} 

Il mio corso di mappatura:

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

Qualsiasi idea di come risolvere il mio problema?

+0

Cosa hai provato? Se aggiungi un corso a un docente e successivamente salvi il docente, puoi vedere nel database se sono state compilate le tabelle LECTURER e LECTURER_COURSE? –

+0

sì popolerà il database. la mia domanda è come memorizzare i valori di capacità per i corsi. un corso può avere diverse capacità per ogni docente. come posso mappare il campo di capacità? – erencan

+0

Dai un'occhiata alla risposta di axtavt a questa domanda: http://stackoverflow.com/questions/4751902/adding-additional-property-to-hibernate-jointable –

risposta

27

è necessario utilizzare @EmbeddedId e @Embeddable annotazioni per risolvere questo problema:

Docente Classe:

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

} 

Classe di corso:

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

} 

LecturerCourse Classe:

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

} 

Your principale dovrebbe essere qualcosa di simile:

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

Hai bisogno di essere sicuri che la classe contrassegnato come @Embeddable dovrebbe implementare l'interfaccia Serializable marcatore.

Spero che aiuti.

+0

grazie mille per la risposta dettagliata. Ho risolto il problema in modo simile alla tua risposta. tuttavia, mi chiedo se ci sia una soluzione senza un'entità intermedia come LecturerCourse. ho provato quelli http: // StackOverflow.com/domande/4751902/aggiungendo-addizionale-proprietà-to-hibernate-jointable. ma non ha funzionato. ho letto la documentazione http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.html. ancora non ho potuto risolvere il problema. – erencan

+0

Sfortunatamente, non ho familiarità con un altro metodo. Sto usando il codice sopra per creare chiavi primarie composite e colonne aggiuntive nel tuo caso. –

+0

vedo. grazie ancora. se riesco a trovare una soluzione. lo posterò anche a te. – erencan

Problemi correlati