将联结表中的值映射到实体

时间:2011-09-29 19:25:12

标签: jpa

我有一个USER表和一个COURSE表。用户可以拥有许多课程,而且很多用户都可以参加课程。联结表包含一个ROLE值,用于确定用户在课程中的角色(即教师,学生等)。我需要知道如何将此角色与每个USER的COURSE相关联。

如果我将该角色放在Course类中,它就无法工作,因为一个Course有很多用户,反之亦然。

这是我到目前为止所拥有的:

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

    ...

注意:我无法更改数据库架构,因此联结表是不可协商的。

2 个答案:

答案 0 :(得分:9)

你的案子中有第三个实体,它想要出来。你可以称之为CourseAssignment。 CourseAssignment将包含角色,以及与用户和角色的ManyToOne关系。此外,当然还有OneToMany从课程到CourseAssignment以及从User到CourseAssignment的关系。

这样的东西会起作用(我没试过,所以可能会遗漏一些东西,但你会明白的。

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

..
}

当然,删除那些现有的关系连接属性。

答案 1 :(得分:1)

正如您所说,将角色添加到用户没有意义,因为用户可能有很多课程,并且将该角色添加到课程将不起作用,因为课程可能有很多用户。

所以你需要另一个实体。类似的东西:

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

每个用户都会有很多CourseUser,每个课程都有很多CourseUsers。