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

我认为这种关系应该是使用hibernate吗,我实际上没有'BAND_VENUES'的映射,那么我该如何创建关系呢?

我正在使用注释而不是映射文件

4

3 回答 3

2

在多对多关系获得属性的那一刻,它不再是关系。关系在 JPA 中没有属性,实体有。

这种“与属性的关系”被建模为一个中间实体,它将与原始实体具有多对一的关系,在本例中为 toBand和 to 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 ----< BAND_VENUES >---- VENUE

并为其添加时间戳。

这自然会导致一个新实体GIG取代(匿名)BAND_VENUES连接表。它有一个

  • 多对一的关系BAND
  • 多对一的关系VENUE
  • 时间戳
  • ...
于 2013-06-03T20:07:43.453 回答
1

我同意马塞尔的观点(他打败了我,但我已经写好了)。通过制作一个名为 Performance 的“连接”表,您基本上拥有相同的东西。(请原谅我的伪代码)大致类似于:

@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 回答