2009-07-20 26 views
13

私はこれらの二つのクラス(テーブル)@ManyToMany Hibernateの余分なテーブルに余分なフィールドを追加できますか?

@Entity 
@Table(name = "course") 
public class Course { 

    @Id 
    @Column(name = "courseid") 
    private String courseId; 
    @Column(name = "coursename") 
    private String courseName; 
    @Column(name = "vahed") 
    private int vahed; 
    @Column(name = "coursedep") 
    private int dep; 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "student_course", joinColumns = @JoinColumn(name = "course_id"), inverseJoinColumns = @JoinColumn(name = "student_id")) 
    private Set<Student> student = new HashSet<Student>(); 
//Some setter and getter 

この1持っている:今、私はどのようにすることができます知りたい、余分なテーブルがデータベース(student_course)で作成されたこのコードを実行した後

@Entity 
    @Table(name = "student") 
    public class Student { 

     @Id 
     @Column(name="studid") 
     private String stId; 
     @Column(nullable = false, name="studname") 
     private String studName; 
     @Column(name="stmajor") 
     private String stMajor; 
     @Column(name="stlevel", length=3) 
     private String stLevel; 
     @Column(name="stdep") 
     private int stdep; 

     @ManyToMany(fetch = FetchType.LAZY) 
     @JoinTable(name = "student_course" 
       ,joinColumns = @JoinColumn(name = "student_id") 
       ,inverseJoinColumns = @JoinColumn(name = "course_id") 
     ) 
     private Set<Course> course = new HashSet<Course>(); 
//Some setter and getter 

を私はいくつかのソリューションを参照してくださいが、私はそれを好きではない (グレード、日付、および...(私はstudent_courseテーブルを意味する))のように、この表に余分なフィールドを追加し、また、私は彼らといくつかの問題を抱えている:

First Sample

+0

many2many関係のソート順を格納するために使用されるint列である\ @OrderColumnを使用して、追加の列を1つ追加できます。私は彼らがfromDateフィールドとtoDateフィールドを追加するために\ @TempolalColumnsを追加したいと思っています –

答えて

16

リンクテーブル(STUDENT_COURSE)に余分なフィールドを追加する場合は、以下のようにskaffmanの答えにしたがってアプローチを選択する必要があります。

は、リンクされたテーブル(STUDENT_COURSEが)によると@Embeddableのように振舞うのアプローチがあります:あなたは両方の学生やコースのクラスになります

@Embeddable 
public class JoinedStudentCourse { 

    // Lets suppose you have added this field 
    @Column(updatable=false) 
    private Date joinedDate; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="STUDENT_ID", insertable=false, updatable=false) 
    private Student student; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="COURSE_ID", insertable=false, updatable=false) 
    private Course course; 

    // getter's and setter's 

    public boolean equals(Object instance) { 
     if(instance == null) 
      return false; 

     if(!(instance instanceof JoinedStudentCourse)) 
      return false; 

     JoinedStudentCourse other = (JoinedStudentCourse) instance; 
     if(!(student.getId().equals(other.getStudent().getId())) 
      return false; 

     if(!(course.getId().equals(other.getCourse().getId())) 
      return false; 

     // ATT: use immutable fields like joinedDate in equals() implementation 
     if(!(joinedDate.equals(other.getJoinedDate())) 
      return false; 

     return true; 
    } 

    public int hashcode() { 
     // hashcode implementation 
    } 

} 

public class Student { 

    @CollectionOfElements 
    @JoinTable(
     [email protected](name="STUDENT_COURSE"), 
     [email protected](name="STUDENT_ID") 
    ) 
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>(); 

} 

public class Course { 

    @CollectionOfElements 
    @JoinTable(
     [email protected](name="STUDENT_COURSE"), 
     [email protected](name="COURSE_ID") 
    ) 
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>(); 

} 

覚えています:@ Embeddableクラスは、所有するエンティティクラス(StudentとCourseの両方)にバインドされたライフサイクルを持ちますので、世話をしてください。

アドバイス:Hibernateチームは@ManyToManyマッピング - カスケード操作のいくつかの制限により、これらの2つのアプローチ(@OneToMany(skaffmanの答え)または@CollectionsOfElements)をサポートします。受け入れ答えは残念ながら私のために動作しません

に関して、

+0

すばらしい答え。リストにマッピングするためにindex-columnが必要な場合は、ただ1つの@OrderColumnを追加することができます。 – cproinger

+2

上記の解決策を試したとき、 'コレクションのためのマッピングで繰り返し列が見つかりました。何か案が ? –

+0

Ankur Ra​​iyaniと同じエラーが発生しています。私の解決策はskaffmanです。生徒の中に埋め込まれたIDを使用して、正しいプライマリキーがあるかどうかを確認してください。 そして、埋め込まれたキーを削除し、各manToOneリレーションごとに@Idを投げました –

7

student_courseテーブルは、純粋に2つのエンティティ間の関連付けを記録します。これは、休止状態によって管理され、他のデータを含めることはできません。

記録したいデータの種類は、別のエンティティとしてモデル化する必要があります。おそらく、CourseとStudentResult(等級を含む)との間に1対多数の関連付けをしてから、StdentResultとStudentとの多対1の関連付けを行うことができます。

+0

Tanx男私はそれを考慮する – Am1rr3zA

3

多対多を削除し、StudentCourseRelationshipというクラスを作成し、StudentおよびCourseのmanysにStudentCourseRelationshipを設定します。

あなたはDateEnrolledのように、DateKickedOutなど、その上であらゆるものを置くことができるなど

IMO多対多マッピングは、詐欺のビットです。

+0

Tanx男私はそれを考慮する – Am1rr3zA

+1

DateGotToGripsWithAssociationsはいかがですか? :) – skaffman

関連する問題