spring - 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 中映射它们
解决方案
@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;
}
这看起来是对的。当然,如果您愿意,您可以使任何关系成为双向的。
推荐阅读
- arduino - Arduino WiFiManager - 串行打印输出 SSID
- python - 如何在 Python 的列表中添加所有数字?
- c# - Asp.net MVC:无法将“Models.RegisterViewModel”类型的对象转换为“Models.ApplicationUser”类型
- canvas - p5.js WEBGL / 调整窗口大小时对象居中
- ruby - 将我的 Jekyll 站点从版本 3 更新到 4 后,我的 Ruby 文件夹(saasc-2.4.0)变得非常大!如何防止积累宝贵的构建时间?
- php - Symfony 5.2 DkimSigner 不工作(DKIM 查找 KO)
- linux - 内核模块 makefile 编译但在执行时给出未定义的错误
- java - org.hibernate.AnnotationException:@OneToOne on com.abc.dto.Test.name 引用了一个未知实体:com.abc.type.TestName
- postgresql - 在函数中为变量使用输入的属性值的方法 | PostgreSQL
- xml - XSLT 命名空间理解