【问题标题】:Mapping between 3 entities3个实体之间的映射
【发布时间】:2020-03-24 15:12:49
【问题描述】:

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

这个想法是:
А GAME 可以有多个 DISCIPLINE
А PLAYER如果要参加不同学科的比赛,可以多次申请游戏。
换句话说,我们在 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           |

或者我认为最好的方法是在 db 中有这个结构:

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

【问题讨论】:

  • 这和spring有什么关系,这是一个基本的数据库问题...
  • @123 啊,标签上的错误..我只想包含JPA,现在修复它

标签: spring hibernate jpa hibernate-mapping


【解决方案1】:
@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;
}

这看起来是对的。当然,您可以根据需要将任何关系设为双向。

【讨论】:

  • 也许从我给出的描述中并不清楚许多学科可以应用于许多游戏。因为目前表 'disciplines' 有“id”、“name”和“game_id”,这不允许将相同的学科添加到另一个游戏中。
  • @VasilEmilov 好吧,我猜你说“游戏和纪律之间的 OneToMany 关系”的部分。让我相信这是一对多的关系,而不是多对多的关系......
  • @VasilEmilov 我对答案进行了编辑以包含新的多对多关系。
  • 我编辑了这个问题,因为您的编辑仍然不能满足我的要求。也许我添加的视觉表示将有助于如何在 java 端创建它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多