2011-09-29 20 views
6

Bir USER tablomuz ve bir COURSE tablom var. Bir KULLANICI birçok DERS ve bir çok KULLANICI olabilir. Birleşim tablosu, kullanıcının bir DERSİNDE (yani, Eğitmen, Öğrenci, vb.) Hangi rolünü belirlediğini belirleyen bir ROL değeri içerir. Bu rolü her bir KULLANICI için DERSE ile nasıl ilişkilendirdiğime ihtiyacım var.Birleşim tablosundaki Varlık değerini eşleme

Bu kursu Ders sınıfına koyarsam, bir Kur’un birçok kullanıcısı olduğundan ve tersi Kullanıcı sınıfında çalışamaz.

İşte ben bugüne kadar ne var:

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

    ... 

Not: Ben veritabanı şemasını değiştiremem, böylece kavşak tablo tartışıImayacak olduğunu.

cevap

9

Durumunuzda üçüncü öğe var ve dışarı çıkmak istiyor. Kurs Tablosunu arayabilirsiniz. KursAssignment hem Kullanıcı hem de Rol için rol ve ManyToOne ilişkisi içerecektir. Ve tabii ki Kurstan Ders Atama ve Kullanıcıdan Ders Atama'ya kadar OneToMany ilişkisi. Böyle

İçimden hiç güvenilir o (çalışacaktır, bu nedenle bir şey eksik olabilir, ama fikir olacaktır.

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

.. 
} 

Ve tabii bu mevcut ilişki bağlı özelliklerini kaldırın.

+0

17 saniyede beni yendi ... güzel cevap. – digitaljoel

1

Dediğiniz gibi, kullanıcıya rol ekleyerek kullanıcı birçok ders geçmiş olabileceğinden mantıklı değil ve elbette birçok kullanıcı olabilir, çünkü derse rol ekleyerek çalışmayacak.

Gidip bir tane ihtiyaç varlık gibi:

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

Her Kullanıcıda çok sayıda Kursiyer bulunur ve her Kursun çok sayıda Kursiyeri vardır.

İlgili konular