Java 使用附加表休眠多对多关系
我正在使用Hibernate,我希望能够创建多对多对多的关系。目前的情况是:- 一个乐队可以在许多场地演奏,一个场地可能有许多乐队Java 使用附加表休眠多对多关系,java,sql,database,hibernate,jta,Java,Sql,Database,Hibernate,Jta,我正在使用Hibernate,我希望能够创建多对多对多的关系。目前的情况是:- 一个乐队可以在许多场地演奏,一个场地可能有许多乐队 BAND >------< VENUE 及 这看起来很简单,对我来说很有意义 我感到困惑的是,如果我使用以下场景添加另一个多对多关系 乐队可能在不同的日期/时间在多个场地演奏,因此:- BAND ----< GIG_DATES >-----< GIG_DATES_VENUES >---- VENUE 这就是我认为应该建立的关系
BAND >------< VENUE
及
这看起来很简单,对我来说很有意义
我感到困惑的是,如果我使用以下场景添加另一个多对多关系
乐队可能在不同的日期/时间在多个场地演奏,因此:-
BAND ----< GIG_DATES >-----< GIG_DATES_VENUES >---- VENUE
这就是我认为应该建立的关系。然而,使用hibernate,我实际上没有“BAND_Vinces”的映射,那么我该如何建立这种关系呢
我使用的是注释而不是映射文件不确定这是否是您喜欢听到的内容,但我的做法略有不同 乐队不是在特定的日期/时间在某个地点演奏吗 因此,我从概念上扩展了最初的BAND_场地连接表 乐队--
不确定这是否是你喜欢听到的,但我会稍微改变一下 乐队不是在特定的日期/时间在某个地点演奏吗 因此,我从概念上扩展了最初的BAND_场地连接表 乐队--
当多对多关系获得属性时,它不再是关系。关系在JPA中没有属性,实体有 这种与属性的关系被建模为一个中间实体,它与原始实体(在本例中是与乐队和场地)具有多对一的关系。大致如下:
@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;
...
}
当多对多关系获得属性时,它不再是关系。关系在JPA中没有属性,实体有 这种与属性的关系被建模为一个中间实体,它与原始实体(在本例中是与乐队和场地)具有多对一的关系。大致如下:
@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;
...
}
我同意Marcel的观点,他比我快,但我已经写了这个。通过创建一个名为Performance的“join”表,您基本上拥有相同的功能。请原谅我的伪代码大致如下:
@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;
}
我同意Marcel的观点,他比我快,但我已经写了这个。通过创建一个名为Performance的“join”表,您基本上拥有相同的功能。请原谅我的伪代码大致如下:
@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;
}
我明白了,那么日期/时间是否会成为复合键的一部分呢?否则,我假设乐队只能在提供的答案解决了我的问题后才能在某个场地演奏,因此我将此标记为正确答案,因为它首先得到了回答。您最好将新的Gig实体视为所有其他实体:为其分配一个自动生成的单列ID。如果需要,请在其他三个字段上添加唯一约束,但单列、自动生成的键更干净、更高效、更易于使用。这允许更改演出的日期,如果日期是PK的一部分,这是不可能的。是的,这当然更好…我应该在我的评论中包括这一点,sryI,看,那么日期/时间是否会成为合成键的一部分?否则,我假设乐队只能在提供的答案解决了我的问题后才能在某个场地演奏,因此我将此标记为正确答案,因为它首先得到了回答。您最好将新的Gig实体视为所有其他实体:为其分配一个自动生成的单列ID。如果需要,请在其他三个字段上添加唯一约束,但单列、自动生成的键更干净、更高效、更易于使用。这允许更改演出的日期,如果日期是PK的一部分,这是不可能的。是的,这当然更好…我应该在我的评论中包括这一点,sryI,看,那么日期/时间是否会成为合成键的一部分?否则,我假设一个乐队只有在我欣赏你的答案时才能在某个场地演奏,我给了它+1,但是Marcel Stör的答案是一样的,并且帮助了同样多的人,因为他首先发布了我将他的答案标记为正确的答案:-+1用于这一部分:在多对多关系获得属性的那一刻,这不再是关系。关系在JPA中没有属性,实体有。这是他们所接受的答案所没有的关键部分。我明白了,那么日期/时间是否会成为复合关键的一部分呢?否则,我假设一个乐队只有在我欣赏你的答案时才能在某个场地演奏,我已经给了它+1的答案,不过是马塞尔·斯特尔的答案 同样,他也帮了我很多忙,既然他先发了帖子,我就把他的答案标记为正确答案:-+1,这一部分:当多对多关系获得属性时,它就不再是关系了。关系在JPA中没有属性,实体有。这是他们所接受的答案所没有的关键部分。
@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;
}