【问题标题】:Mapping value in junction table to Entity将联结表中的值映射到实体
【发布时间】:2011-09-29 19:25:11
【问题描述】:

我有一个 USER 表和一个 COURSE 表。一个 USER 可以有很多 COURSES,而一个 COURSE 可以有很多 USERS。联结表包含一个 ROLE 值,该值确定用户在课程中的角色(即讲师、学生等)。我需要一些如何将此角色与每个用户的课程相关联。

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

这是我目前所拥有的:

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

    ...

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

【问题讨论】:

    标签: jpa


    【解决方案1】:

    在你的案例中存在第三个实体,它想要出来。您可以将其称为 CourseAssignment。 CourseAssignment 将包含角色,以及与用户和角色的多对一关系。当然还有从 Course 到 CourseAssignment 以及从 User 到 CourseAssignment 的 OneToMany 关系。

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

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

    当然还要移除那些现有的关系关联属性。

    【讨论】:

    • 比我快 17 秒...不错的答案。
    【解决方案2】:

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

    所以你需要另一个实体。比如:

    @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,每个 Course 会有很多 CourseUser。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多