2011-09-29 9 views
6

Tengo una tabla de USUARIO y una tabla de CURSO. Un USUARIO puede tener muchos CURSOS y, POR SUPUESTO, muchos USUARIOS. La tabla de unión contiene un valor ROLE que determina qué función tiene el usuario en un CURSO (es decir, Instructor, Estudiante, etc.). Necesito de alguna forma asociar este rol con el CURSO para cada USUARIO.Asignando valor en la tabla de unión a la entidad

Si pongo el rol en la clase del curso, no puede funcionar, ya que un curso tiene muchos usuarios y viceversa en la clase de usuario.

Esto es lo que tengo hasta ahora:

@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: No puedo cambiar el esquema de base de datos, por lo que la tabla de unión no es negociable.

Respuesta

9

Hay una tercera entidad en su caso, y quiere salir. Puedes llamarlo CourseAssignment. CourseAssignment contendrá la función y la relación ManyToOne con User and Role. Y además, por supuesto, la relación OneToMany de Course a CourseAssignment y de User a CourseAssignment.

Algo como esto va a funcionar (no lo probé, así que algo puede ser que faltan, pero usted conseguirá la 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; 

.. 
} 

Y, por supuesto, eliminar esos atributos relación de conexión existentes.

+0

me gana por 17 segundos ... buena respuesta. – digitaljoel

1

Como dices, agregar el rol al usuario no tiene sentido ya que el usuario puede tener muchos cursos, y agregar el rol al curso no funcionará porque un curso puede tener muchos usuarios.

Así que necesitas otro entidad. Algo como:

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

Y cada Usuario tendría muchos CourseUsers y cada Curso tendría muchos CourseUsers.

Cuestiones relacionadas