2011-09-29 4 views
6

私はUSERテーブルとCOURSEテーブルを持っています。ユーザーは多くのコースを持つことができ、コースは多くのUSERSを持つことができます。ジャンクションテーブルには、ユーザーがコース(インストラクター、学生など)でどのような役割を果たしているかを決定するROLE値が含まれています。私は、各ユーザのこの役割をどのように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; 

    ... 

注:私は、データベーススキーマを変更することはできませんので、接合テーブルは譲れないです。

答えて

9

あなたのケースでは3番目のエンティティがあり、出て欲しいです。 CourseAssignmentと呼ぶことができます。 CourseAssignmentには役割と、ユーザーと役割の両方に対するManyToOne関係が含まれます。もちろんコースからコースアサインメントへ、そしてユーザーからコースアサインメントへの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; 

.. 
} 

そしてもちろん、これらの既存の関係接続属性を削除する(動作します。

+0

17秒で私を倒す...いい答え。 – digitaljoel

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

各ユーザーには多くのコースユーザーがおり、各コースには多数のコースユーザーが参加します。

関連する問題