2011-09-29 8 views
6

Ho una tabella USER e una tabella COURSE. Un UTENTE può avere molti CORSI e un CORSO molti UTENTI. La tabella di giunzione contiene un valore di RUOLO che determina il ruolo che l'utente ha in un CORSO (ad esempio Istruttore, Studente, ecc.). Ho bisogno di un po 'come associare questo ruolo al CORSO per ogni UTENTE.Valore di mapping nella tabella di congiunzione all'entità

Se inserisco il ruolo nella classe Course, non può funzionare, poiché un corso ha molti utenti e viceversa nella classe User.

Ecco quello che ho finora:

@Entity 
@Table(name = "USERS") 
public class User { 

@Id 
@Column(name = "PK1") 
private Long id; 

@Column(name = "USER_ID") 
private String userId; 

@ManyToMany 
@JoinTable(name = "COURSE_USERS", 
    joinColumns = @JoinColumn(name = "USERS_PK1", referencedColumnName = "PK1"), 
    inverseJoinColumns = @JoinColumn(name = "CRSMAIN_PK1", referencedColumnName = "PK1")) 
private Collection<Course> courses; 

... 

@Entity 
@Table(name = "COURSE") 
@SecondaryTable(name = "COURSE_USERS", 
pkJoinColumns = @PrimaryKeyJoinColumn(name = "CRSMAIN_PK1")) 
public class Course { 

@Id 
@Column(name = "PK1") 
private Long id; 

    // THIS PROBABLY WON'T WORK // 
@Column(name = "ROLE", table = "COURSE_USERS") 
private Character role; 

@Column(name = "AVAILABLE_IND") 
private boolean available; 

@Column(name = "COURSE_NAME") 
private String name; 

@Transient 
private String url; 

    ... 

Nota: Non riesco a cambiare lo schema del database, in modo che la tabella di collegamento non è negoziabile.

risposta

9

C'è una terza entità nel tuo caso e vuole uscire. Puoi chiamarlo CourseAssignment. CourseAssignment conterrà il ruolo e la relazione ManyToOne con l'utente e il ruolo. E inoltre, naturalmente, OneToMany relazione da Corso a CourseAssignment e da User a CourseAssignment.

Qualcosa di simile funziona (non ho provato, quindi qualcosa può mancare, ma si otterrà un'idea.

@Entity 
@Table(name = "COURSE_USERS") 
@IdClass(CourseAssignmentId.class) 
public class CourseAssignment { 
    @Id 
    @ManyToOne 
    @JoinColumn(name="USERS_PK1") 
    private User user; 
    @Id 
    @ManyToOne 
    @JoinColumn(name="CRSMAIN_PK1") 
    private Course course; 

    @Column(name = "ROLE") 
    private Character role; 
} 
//and then of course IdClass, because combined key: 
@Embeddable 
public class CourseAssignmentId implements Serializable{ 
    @Column(name="USERS_PK1") 
    private Long user; 

    @Column(name="CRSMAIN_PK1") 
    private Long course; 
} 


User { .. 

    @OneToMany(mappedBy = "user") 
    private Collection<CourseAssignment> courseAssignments; 
... 
} 

Course {.. 
    @OneToMany(mappedBy = "course") 
    private Collection<CourseAssignment> course; 

.. 
} 

E naturalmente rimuovere quegli attributi relazionali connessi esistenti.

+0

mi ha battuto di 17 secondi ... bella risposta. – digitaljoel

1

Come dici tu, aggiungere il ruolo all'utente non ha senso poiché l'utente può avere molti corsi e aggiungere il ruolo al corso non funzionerà perché un corso potrebbe avere molti utenti.

Quindi hai bisogno di un altro entità. Qualcosa del genere:

@Entity 
@Table(name = "COURSE_USERS") 
// @pkJoinColumns = probably some combination of user/course 
public class CourseUser { 

@Column(name = "ROLE") 
private Character role; 

@Column(name = "USERS_PK1") 
private User user; 

@Column(name = "CRSMAIN_PK1") 
private Course course; 
} 

E ogni utente avrebbe molti CourseUser e ogni corso avrebbe molti CourseUser.

Problemi correlati