【问题标题】:Hibernate join tables with mapsHibernate 使用地图连接表
【发布时间】:2022-01-28 16:04:32
【问题描述】:

所以我正在让自己跟上 Hibernate 的速度,但我遇到了一个我不太了解如何在 Hibernate 中建模的问题,我可以使用一些指导/建议。

所以我正在建立一个数据库来记录马里奥赛车锦标赛(可以是任何赛车锦标赛)的结果。我有以下实体:

  • 玩家 - 玩家的名字和姓氏
  • 曲目 - 曲目名称
  • 比赛 - 比赛所在的赛道、比赛日期、比赛所属的锦标赛以及参加比赛的球员
  • 比赛 - 比赛名称、参加比赛的球员、参加比赛的比赛

我正在努力解决的问题是种族和玩家之间的关系。我认为应该使用连接表来解决多对多问题,但我认为它还需要有一个字段来显示给定玩家在给定比赛中完成的位置(也可以是得分,但那是易于从一种转换为另一种)。这将有一个包含玩家 ID、种族 ID 和积分的连接表。

我应该在这里使用什么样的注释?我觉得他们应该在 Race 实体上,因为积分的概念仅在给定比赛的背景下才有意义,但是我不知道此时我在做什么。

感谢任何指导/帮助/想法。

【问题讨论】:

    标签: java database hibernate spring-mvc


    【解决方案1】:

    如果我必须这样做,我会将我的实体基于一个种族。 每场比赛都有一个赛道,并包含一份球员名单以及他们各自的位置。

    锦标赛将是一个种族列表。

    最后,我希望数据库看起来像这样:

    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
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多