[英]Hibernate Many-to-Many relationship with an additional table
我正在使用Hibernate,我希望能够创建一个多对多的关系。 目前的情况是: -
乐队可以在许多场地演出,场地可能有很多乐队。
BAND >------< VENUE
这将构成多对多关系,因此我使用连接表,例如: -
BAND ----< BAND_VENUES >---- VENUE
我能够使用hibernate或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'的映射,那么我该如何创建这种关系呢?
我正在使用注释而不是映射文件
在多对多关系获得属性的那一刻,它不再是关系了。 关系在JPA中没有属性,实体也没有。
这种“与属性的关系”被建模为一个中间实体,它与原始实体有很多对一的关系,在这种情况下是Band
和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;
...
}
不确定这是否是你喜欢听到的,但我的处理方式略有不同。
乐队在特定日期/时间不在场地演出吗?
因此,我从概念上“扩展”了最初的BAND_VENUES
连接表
BAND ---- <BAND_VENUES> ---- VENUE
并为其添加时间戳。
这自然会导致一个新的实体GIG
取代(匿名) BAND_VENUES
连接表。 它有一个
BAND
的多对一关系 VENUE
的多对一关系 我同意马塞尔(他打败了我,但我已经写了这篇文章)。 通过创建一个名为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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.