2011-07-14 5 views
1

私は3つのテーブル:Band、BandGenre、Genreを持っています。Hibernate - Jointableを使ってテーブルを結合する

今はBandをBandGenreに参加させ、BandGenreをGenreに参加させています。これは少し多いようです。私は、Hibernateが結合テーブルを見つけることができる様々な場所(ここを含む)を読んだことがありますが、どうやってそれを行うのか分かりません。

Band.hbm.xml

<class name="com.myProject.hibernate.Band" table="Band"> 
     <id name="bandid"> 
      <generator class="increment"/> 
     </id> 
     <property name="name"/> 
     <set name="bandGenres" lazy="false"> 
      <key column="bandid"/> 
      <one-to-many class="com.myProject.hibernate.BandGenre"/> 
     </set> 
    </class> 

BandGenre.hbm.xml(jointable)

<class name="com.myProject.hibernate.BandGenre" table="BandGenre"> 
     <id name="bandgenreid"> 
      <generator class="increment"/> 
     </id> 
     <property name="bandid"/> 
     <property name="genreid"/> 
     <one-to-one name="genre" class="com.myProject.hibernate.Genre"> 
      <!-- the <formula> gets Hibernate to join Genre on BandGenre.genreid (rather than BandGenre.bandgenreid) --> 
      <formula>genreid</formula> 
     </one-to-one> 
    </class> 

Genre.hbm.xml:

だからここに私のhbm.xmlファイルです

私のBaを取得するにはGenreに直接参加することができます(できればparentidで注文できます)。

答えて

0

join tableとしてBandGenreを使用して、BandGenreを一緒に参加させることができます。

<class name="com.myProject.hibernate.Band" table="Band"> 
    <id name="bandid"> 
     <generator class="increment"/> 
    </id> 
    <property name="name"/> 
    <set name="genres" lazy="false" table="BandGenre"> 
     <key column="bandid"/> 
     <many-to-many class="com.myProject.hibernate.Genre" column="genreid"/> <!-- add ' unique="true"' for a one-to-many relationship --> 
    </set> 
</class> 

だけではなく、BandGenre秒のGenreのリストを持っているあなたのBand POJOを変更します。先に進み、BandGenre.hbm.xmlを捨てなさい。

+0

コードを使用すると、「リソースcom/bandbrokers/hibernate/Band.hbm.xmlのマッピングドキュメントを解析できませんでした」 - 「属性」列は、要素型「1対多」の宣言が必要です。 。 もちろん、あなたのコードのように "column"属性が設定されています。 – laughingbovine

+0

私はHibernate 3.2を使用していましたが、3.6.5.Finalにアップグレードされましたが、今でも同じエラーが発生しています。 – laughingbovine

+0

私の悪いです。バンドが本当に1つのジャンルだけを持つことができれば(複数のジャンルではなく)、「一意=真」で「多対多」を持たなければなりません。回答は修正されました。 –

関連する問題