首页 > 解决方案 > 3个实体之间的映射

问题描述

我有 3 个实体。游戏、纪律和玩家。(为了简单起见,假设它们都有 id 和 name 属性)

这个想法是:
А GAME 可以有多个 DISCIPLINEs
А PLAYER 如果要参加不同的 DISCIPLINE 比赛,可以多次申请 GAME。
换句话说,我们在 PLAYER 和 GAME 之间有 ManyToMany 关系,在 GAME 和 DISCIPLINE 之间有 OneToMany 关系。
我需要的是一种将玩家映射到具有具体纪律的游戏的方法
我很困惑如何实际创建实体以进行此类映射。我可以想象一张桌子的样子是这样的:

    game_id |   discipline_id   |   player_id   |
    1       |   1               |   1           |
    1       |   2               |   1           |
    2       |   2               |   2           |
    2       |   3               |   3           |
    2       |   3               |   1           |

或者我认为最好是在数据库中有这个结构: 在此处输入图像描述

但我不知道如何创建这样的实体以及如何在 java 中映射它们

标签: springhibernatejpahibernate-mapping

解决方案


@Entity
@Getter
@Setter
@Table(name = "player")
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name", nullable = false)
    private String name;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "player_games",
                joinColumns = @JoinColumn(name = "player_id"),
                inverseJoinColumns = @JoinColumn(name = "game_with_discipline"))
    private List<GameDiscipline> gamesWithDiscipline;
}
@Entity
@Getter
@Setter
@Table(name = "game")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name", nullable = false)
    private String name;
}
@Entity
@Getter
@Setter
@Table(name = "discipline")
public class Discipline {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name", nullable = false)
    private String name;
}
@Entity
@Getter
@Setter
@Table(name = "game_disciplines")
public class GameDiscipline {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "game_id", nullable = false)
    private Game game;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "discipline_id", nullable = false)
    private Discipline discipline;
}

这看起来是对的。当然,如果您愿意,您可以使任何关系成为双向的。


推荐阅读