2012-04-24 4 views
17

3つの結合が必要な多対多のハイバネートマッピングが必要です。私はLecturerCourseのような中間のエンティティなしで解決策を見つけようとしました。結合テーブルの追加プロパティのために多対多のHibernateマッピングを作成するにはどうすればよいですか?

私の講師とコーステーブルの間には、データベースに多かれ少なかれの関係があります。講師はいくつかの講義者によって講習を受けることができ、講師はいくつかの講義を行うことができます。

私はコースを手前に保管しています。しかし、私は講師に講座を割り当てる必要があります。私がコースを割り当てたら、そのコースのキャパシティも保存します。

私のデータベースダイアグラム:

enter image description here

私は休止状態と春を使用しています。コースに任意の講師が割り当てられている場合は、ハイバネートマッピングが必要です。容量フィールドに値を追加する必要があります。

マイ講師マッピング:

@Entity 
@Table(name="LECTURER") 
public class Lecturer { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ") 
    @SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ") 
    private Long Id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="SURNAME") 
    private String surname; 


    @Column(name="EMAIL") 
    private String email; 

    @Column(name="USERNAME") 
    private String username; 

    @Column(name="PASSWORD") 
    private String Password; 

    @ManyToMany 
    @JoinTable(
      name="LECTURER_COURSE", 
      [email protected](name="LECTURER_ID"), 
      [email protected](name="COURSE_ID") 
    ) 
    private List<Course> courses; 

    //getters - setters 
} 

マイコースマッピング:

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

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ") 
    @SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ") 
    private Long id; 

    @Column(name="NAME") 
    private String name; 

    @Column(name="CODE") 
    private String code; 
} 

私の問題を解決するためにどのように任意のアイデア?

+0

何を試しましたか?講師にコースを追加して講師を保存すると、データベースにLECTURERテーブルとLECTURER_COURSEテーブルが設定されているかどうかを確認できますか? –

+0

はいそれはデータベースに入力されます。私の質問は、どのようにコースの容量値を格納するかです。コースは講師ごとにいくつかの能力を持つことができます。容量フィールドをどのようにマップできますか? – erencan

+0

この質問に対するaxtavtの答えを見てください:http://stackoverflow.com/questions/4751902/adding-additional-property-to-hibernate-jointable –

答えて

27

あなたがこの問題を解決するために@EmbeddedId@Embeddable注釈を使用する必要があります。

講師クラス:

@Entity 
@Table(name="LECTURER") 
public class Lecturer { 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL) 
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); 

//all others properties Setters and getters are less relevant. 

} 

コースクラス:

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

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL) 
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>(); 

//all others properties Setters and getters are less relevant. 

} 

LecturerCourseクラス:

@Entity 
@Table(name = "lecturer_course") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.lecturer", 
      joinColumns = @JoinColumn(name = "LECTURER_ID")), 
     @AssociationOverride(name = "pk.course", 
      joinColumns = @JoinColumn(name = "COURSE_ID")) }) 
public class LecturerCourse { 

    private LecturerCourseID pk = new LecturerCourseID(); 

    @Column(name = "CAPACITY", nullable = false, length = 10) 
    private String capacity; 

    @EmbeddedId 
    public LecturerCourseID getPk() { 
     return pk; 
    } 

} 

今主キー:

Lecturer lecturer1 = new Lecturer(); 
Course math = new Course(); 
LecturerCourse lecturer1math = new LecturerCourse(); 
lecturer1math.setCapacity("capacity"); 
lecturer1math.setLecturer(lecturer1); 
lecturer1math.setCourse(math); 
lecturer1.getLecturerCourses().add(lecturer1math); 

//saving object 
session.save(lecturer1); 

あなたは@EmbeddableとしてマークされたクラスはSerializableマーカーインタフェースを実装する必要があることを確認する必要があります。

@Embeddable 
public class LecturerCourseID implements java.io.Serializable { 

    private Lecturer lecturer; 
    private Course course; 

    @ManyToOne 
    public Stock getLecturer() { 
     return lecturer; 
    } 

    public void setLecturer(Lecturer lecturer) { 
     this.lecturer= lecturer; 
    } 

    @ManyToOne 
    public Course getCourse() { 
     return course; 
    } 

    public void setCourse(Course course) { 
     this.course= course; 
    } 

} 

今あなたの主は、このようなものでなければなりません。

希望します。

+0

詳細な回答をいただきありがとうございます。私はあなたの応答に似た問題を解決しました。しかし、LecturerCourseのような中間のエンティティがなければ、解決策があるのだろうかと思います。私はそれらのhttp:// stackoverflowを試みた。com/questions/4751902/add-additional-property-to-hibernate-jointableを参照してください。しかしそれは働かない。私はドキュメントhttp://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/collections.htmlを読んでいます。それでも問題を解決できませんでした。 – erencan

+0

残念ながら、私は別の方法に慣れていません。上記のコードを使用して、コンポジットの主キーと追加の列を作成しています。参照してください。 –

+0

再度、感謝します。もし私が解決策を見つけることができれば。私はあなたにも投稿します。 – erencan

関連する問題