1

私は Hibernate を使用していますが、多対多対多の関係を作成できるようにしたいと考えています。現在のシナリオ: -

バンドは多くの会場で演奏する場合があり、会場には多くのバンドがいる場合があります。

BAND >------< VENUE

これは多対多の関係を構成するため、次のような結合テーブルを使用します。

BAND ----< BAND_VENUES >---- VENUE

休止状態または SQL の両方を使用してこれを作成できます。テスト ケースを参照してください: -

@Entity
@Table(name = "Band")
public class Band implements Serializable,
{
    @Id
    @GeneratedValue(generator = "bandId" )
    @GenericGenerator(name = "bandId", strategy = "uuid2")
    private String bandId;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "Band_Venues",
    joinColumns =  
    {
        @JoinColumn(name = "bandId")
    },
    inverseJoinColumns = 
    {
        @JoinColumn(name = "venueId")
    })
}

@Entity
@Table(name = "Venue")
public class Venue implements Serializable
{
    @Id
    @GeneratedValue(generator = "venueId" )
    @GenericGenerator(name = "venueId", strategy = "uuid2")
    private String venueId;
}

これは非常に単純なようで、私には理にかなっています。

私が混乱するのは、次のシナリオを使用して別の多対多の関係を追加する場合です。

バンドはさまざまな日時に多くの会場で演奏することがあります。

BAND ----< GIG_DATES >-----< GIG_DATES_VENUES >---- VENUE

関係はあるべきだと私は信じていますが、休止状態を使用していますが、実際には「BAND_VENUES」のマッピングを持っていないので、関係を作成するにはどうすればよいですか?

マッピング ファイルではなく注釈を使用しています

4

3 に答える 3

2

多対多の関係が属性を取得した瞬間、それはもはや関係ではありません。リレーションシップには JPA の属性はありませんが、エンティティには属性があります。

Bandこのような「属性との関係」は、元のエンティティ (この場合は toおよび to ) と多対 1 の関係を持つ中間エンティティとしてモデル化されVenueます。おおよそ次のようになります。

@Entity
@IdClass(GigId.class)
public class Gig {
    @Id
    @ManyToOne
    private Band band
    @Id
    @ManyToOne
    private Venue venue;

}

public class GigId implements Serializable{
    private String band;

    private String venue;
    ...
    //date
}

public class Band { ..
    @OneToMany(mappedBy = "band")
    private Collection<Gig> gigs;
    ...
}

public class Venue {..
   @OneToMany(mappedBy = "venue")
   private Collection<Gig> gigs;
   ...
}
于 2013-06-03T20:08:43.663 に答える
1

これがあなたが聞きたいことかどうかはわかりませんが、私はこれに少し違ったアプローチをします.

バンドは特定の日時に会場で演奏しませんか?

したがって、最初のBAND_VENUES結合テーブルを概念的に「拡張」します

バンド ----< BAND_VENUES >---- 会場

タイムスタンプを追加します。

これは当然、(匿名の)結合テーブルGIGを置き換える新しいエンティティにつながります。BAND_VENUESそれは

  • との多対一の関係BAND
  • との多対一の関係VENUE
  • タイムスタンプ
  • ...
于 2013-06-03T20:07:43.453 に答える
1

私はマルセルに同意します(彼は私を打ち負かしましたが、私はすでにこれを書いていました)。パフォーマンスと呼ばれる「結合」テーブルを作成することで、基本的に同じことができます。(疑似コードですみません)おおよそ次のようなものです:

@Entity
class Band 
{
   @OneToMany
   Performance performance;
}

@Entity   
class Performance
{  
   @ManyToOne
   Band band;
   @OneToOne (or many to many is sometimes easier to work with)
   Venue Venue;
   Date date;
}

@Entity
class Venue {
   String address;
}
于 2013-06-03T20:16:30.757 に答える