Hibernate 使用地图连接表
Hibernate join tables with maps
所以我正在让自己跟上 Hibernate 的速度,我 运行 遇到了一个问题,我不太明白如何在 Hibernate 中建模,我可以使用一些 guidance/advice上。
所以我正在建立一个数据库来记录马里奥赛车锦标赛(可以是任何赛车锦标赛)的结果。我有以下实体:
- 玩家 - 玩家的名字和姓氏
- 曲目 - 曲目名称
- 比赛 - 比赛的赛道、比赛日期、比赛所属的锦标赛以及参加比赛的球员
- 锦标赛 - 锦标赛的名称、参加锦标赛的选手、参加锦标赛的比赛
我正在努力解决的问题是种族和玩家之间的关系。我认为 join table 应该用来解决多对多问题,但我认为它还需要有一个字段来显示给定玩家在给定比赛中完成的位置(也可以是得分,但这很容易从一个转换为另一个)。这将有一个包含玩家 ID、种族 ID 和点数的连接 table。
我应该在这里使用什么样的注释?我觉得他们应该在 Race 实体上,因为点的概念只在给定比赛的背景下才有意义,但是我不知道此时我在做什么。
感谢任何guidance/help/ideas。
如果我必须这样做,我会将我的实体建立在一个种族周围。
每个种族都有一个轨道,并包含一个具有各自位置的玩家列表。
锦标赛将是一个种族列表。
最后,我希望数据库看起来像这样:
Create TABLE race (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
raceName TEXT NOT NULL,
dateOfRace timestamp default CURRENT_TIMESTAMP,
);
Create TABLE track (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
trackName TEXT NOT NULL,
);
Create TABLE race_tracks (
race_id BIGINT UNIQUE,
track_id BIGINT,
CONSTRAINT `FK_RACE_TRACK_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_RACE_TRACK_TRACK_ID` FOREIGN KEY (`track_id`) REFERENCES `track` (`id`)
);
Create TABLE player (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
firstName TEXT NOT NULL,
lastName TEXT NOT NULL,
);
Create TABLE race_participation (
race_id BIGINT,
player_id BIGINT,
position int NOT NULL,
CONSTRAINT `FK_RACE_PART_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_RACE_PART_PLAYER_ID` FOREIGN KEY (`player_id`) REFERENCES `player` (`id`)
);
Create TABLE tournament (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tournamentName TEXT NOT NULL,
);
Create TABLE tournament_races (
race_id BIGINT,
tournament_id BIGINT,
position int NOT NULL,
CONSTRAINT `FK_TOURNEMANT_RACES_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_TOURNEMANT_RACES_TOURNAMENT_ID` FOREIGN KEY (`tournament_id`) REFERENCES `tournament` (`id`)
);
这将导致以下实体
@Entity
@Table(name = "player")
public class Player {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
@OneToMany(mappedBy="player")
private List<RaceParticipation> participation;
// Getter and Settet
}
@Entity
@Table(name = "race")
public class Race {
@Id
@GeneratedValue
private Long id;
@Column(name = "raceName")
private String name;
@Column(name = "dateOfRace", columnDefinition = "timestamp default CURRENT_TIMESTAMP")
private Timestamp dateOfRace;
@OneToMany(mappedBy="race")
private List<RaceParticipation> participation;
@OneToOne
@JoinTable(
name="race_tracks",
joinColumns=@JoinColumn(name = "race_id", referencedColumnName = "id", unique=true),
inverseJoinColumns=@JoinColumn(name = "track_id")
)
private Track track;
// Getter and Setter
}
@Entity
@Table(name="track")
public class Track {
@Id
@GeneratedValue
private Long id;
private String trackName;
// Getter and Setter
}
@Entity
@Table(name = "race_participation")
public class RaceParticipation {
@EmbeddedId
private RaceParticipationId id;
@MapsId("player_id")
@ManyToOne
@JoinColumn(name = "player_id")
private Player player;
@MapsId("race_id")
@ManyToOne
@JoinColumn(name = "race_id")
private Race race;
private Integer position;
// Getter and Setter
}
@Embeddable
public class RaceParticipationId implements Serializable {
@Column(name = "player_id")
private Long player_id;
@Column(name = "race_id")
private Long race_id;
// Getter and Setter
}
@Entity
@Table(name="tournament")
public class Tournament {
@Id
@GeneratedValue
private Long id;
private String tournamentName;
@OneToMany
@JoinTable(
name = "tournament_races",
joinColumns=@JoinColumn(name = "tournament_id",referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="race_id", referencedColumnName="id")
)
private List<Race> races;
// Getter and Setter
}
所以我正在让自己跟上 Hibernate 的速度,我 运行 遇到了一个问题,我不太明白如何在 Hibernate 中建模,我可以使用一些 guidance/advice上。
所以我正在建立一个数据库来记录马里奥赛车锦标赛(可以是任何赛车锦标赛)的结果。我有以下实体:
- 玩家 - 玩家的名字和姓氏
- 曲目 - 曲目名称
- 比赛 - 比赛的赛道、比赛日期、比赛所属的锦标赛以及参加比赛的球员
- 锦标赛 - 锦标赛的名称、参加锦标赛的选手、参加锦标赛的比赛
我正在努力解决的问题是种族和玩家之间的关系。我认为 join table 应该用来解决多对多问题,但我认为它还需要有一个字段来显示给定玩家在给定比赛中完成的位置(也可以是得分,但这很容易从一个转换为另一个)。这将有一个包含玩家 ID、种族 ID 和点数的连接 table。
我应该在这里使用什么样的注释?我觉得他们应该在 Race 实体上,因为点的概念只在给定比赛的背景下才有意义,但是我不知道此时我在做什么。
感谢任何guidance/help/ideas。
如果我必须这样做,我会将我的实体建立在一个种族周围。 每个种族都有一个轨道,并包含一个具有各自位置的玩家列表。
锦标赛将是一个种族列表。
最后,我希望数据库看起来像这样:
Create TABLE race (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
raceName TEXT NOT NULL,
dateOfRace timestamp default CURRENT_TIMESTAMP,
);
Create TABLE track (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
trackName TEXT NOT NULL,
);
Create TABLE race_tracks (
race_id BIGINT UNIQUE,
track_id BIGINT,
CONSTRAINT `FK_RACE_TRACK_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_RACE_TRACK_TRACK_ID` FOREIGN KEY (`track_id`) REFERENCES `track` (`id`)
);
Create TABLE player (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
firstName TEXT NOT NULL,
lastName TEXT NOT NULL,
);
Create TABLE race_participation (
race_id BIGINT,
player_id BIGINT,
position int NOT NULL,
CONSTRAINT `FK_RACE_PART_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_RACE_PART_PLAYER_ID` FOREIGN KEY (`player_id`) REFERENCES `player` (`id`)
);
Create TABLE tournament (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tournamentName TEXT NOT NULL,
);
Create TABLE tournament_races (
race_id BIGINT,
tournament_id BIGINT,
position int NOT NULL,
CONSTRAINT `FK_TOURNEMANT_RACES_RACE_ID` FOREIGN KEY (`race_id`) REFERENCES `race` (`id`),
CONSTRAINT `FK_TOURNEMANT_RACES_TOURNAMENT_ID` FOREIGN KEY (`tournament_id`) REFERENCES `tournament` (`id`)
);
这将导致以下实体
@Entity
@Table(name = "player")
public class Player {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
@OneToMany(mappedBy="player")
private List<RaceParticipation> participation;
// Getter and Settet
}
@Entity
@Table(name = "race")
public class Race {
@Id
@GeneratedValue
private Long id;
@Column(name = "raceName")
private String name;
@Column(name = "dateOfRace", columnDefinition = "timestamp default CURRENT_TIMESTAMP")
private Timestamp dateOfRace;
@OneToMany(mappedBy="race")
private List<RaceParticipation> participation;
@OneToOne
@JoinTable(
name="race_tracks",
joinColumns=@JoinColumn(name = "race_id", referencedColumnName = "id", unique=true),
inverseJoinColumns=@JoinColumn(name = "track_id")
)
private Track track;
// Getter and Setter
}
@Entity
@Table(name="track")
public class Track {
@Id
@GeneratedValue
private Long id;
private String trackName;
// Getter and Setter
}
@Entity
@Table(name = "race_participation")
public class RaceParticipation {
@EmbeddedId
private RaceParticipationId id;
@MapsId("player_id")
@ManyToOne
@JoinColumn(name = "player_id")
private Player player;
@MapsId("race_id")
@ManyToOne
@JoinColumn(name = "race_id")
private Race race;
private Integer position;
// Getter and Setter
}
@Embeddable
public class RaceParticipationId implements Serializable {
@Column(name = "player_id")
private Long player_id;
@Column(name = "race_id")
private Long race_id;
// Getter and Setter
}
@Entity
@Table(name="tournament")
public class Tournament {
@Id
@GeneratedValue
private Long id;
private String tournamentName;
@OneToMany
@JoinTable(
name = "tournament_races",
joinColumns=@JoinColumn(name = "tournament_id",referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="race_id", referencedColumnName="id")
)
private List<Race> races;
// Getter and Setter
}