所以我讓自己跟上 Hibernate 的速度,我遇到了一個問題,我不太明白如何在 Hibernate 中建模,我可以使用一些指導/建議。
所以我正在建立一個資料庫來記錄馬里奧賽車錦標賽(可以是任何賽車錦標賽)的結果。我有以下物體:
- 玩家 - 玩家的名字和姓氏
- 軌道 - 軌道的名稱
- 比賽 - 比賽所在的賽道、比賽日期、比賽所屬的錦標賽以及參加比賽的球員
- 比賽 - 比賽的名稱、參加比賽的球員、參加比賽的比賽
我正在努力解決的問題是種族和玩家之間的關系。我認為應該使用連接表來解決多對多問題,但我認為它還需要有一個欄位來顯示給定玩家在給定比賽中完成的位置(也可以是得分,但那是易于從一種轉換為另一種)。這將有一個包含玩家 ID、種族 ID 和積分的連接表。
我應該在這里使用什么樣的注釋?我覺得他們應該在 Race 物體上,因為積分的概念僅在給定比賽的背景下才有意義,但是我不知道此時我在做什么。
任何指導/幫助/想法表示贊賞。
uj5u.com熱心網友回復:
如果我必須這樣做,我會將我的物體基于一個種族。每場比賽都有一個賽道,并包含一份球員名單以及他們各自的位置。
錦標賽將是一個種族串列。
最后,我希望資料庫看起來像這樣:
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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/425724.html
