如果我必须这样做,我会将我的实体基于一个种族。
每场比赛都有一个赛道,并包含一份球员名单以及他们各自的位置。
锦标赛将是一个种族列表。
最后,我希望数据库看起来像这样:
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
}