我有一个 Users、Players、CoopGames 和 CoopGamesPlayers 表。从概念上讲,我本质上是在尝试重新创建 Order/OrderProducts 类型关系。就我而言,每个 CoopGamesPlayers 条目的键都是 CoopGame id 和 Player id。但是,我陷入困境,因为在我的情况下,我的 Player 类本身有一个复合主键:生成的玩家 id 以及用户 id 外键。我有点迷失了。我已经按照 Order.OrderProducts 教程进行了设置,但我不是 JPA 专家,也从未在 JoinTable 中真正使用过复合键。代码:
public class PlayerPK implements Serializable {
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "id")
private Player player;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "userid")
private User user;
}
@Entity
@Table(name = "players")
public class Player implements Serializable {
@EmbeddedId
private PlayerPK pk;
@Column(name = "image")
private String image;
}
@Entity
@Table(name = "coop_games")
public class CoopGame {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "pk", fetch = FetchType.EAGER)
private List<CoopGamesPlayers> players;
}
public class CoopGamesPlayersPK implements Serializable {
@JsonBackReference
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "coop_game_id")
private CoopGame game;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name="playerid", referencedColumnName="id"),
@JoinColumn(name="userid", referencedColumnName="userid")
})
@MapsId("pk")
private Player player;
}
@Entity
@Table(name = "coop_games_players")
public class CoopGamesPlayers {
@EmbeddedId
private CoopGamesPlayersPK pk;
public CoopGamesPlayers(CoopGame game, Player player) {
pk = new CoopGamesPlayersPK();
pk.setGame(game);
pk.setPlayer(player);
}
}
@Entity
@Table(name = "coop_games")
public class CoopGame {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "pk", fetch = FetchType.EAGER)
private List<CoopGamesPlayers> players;
}
最佳答案
我认为你应该更好地重新考虑你的数据模型与所有关系(应该解决哪个问题?..)。
对于您的 CoopGamesPlayers 表:如果您只想将 CoopGamesPlayers 用作可连接项,则不需要 CoopGamesPlayersPK。
CoopGame 和 CoopGamesPlayers 应该看起来像这样:
@Entity
@Table(name = "coop_games")
public class CoopGame {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@OneToMany(mappedBy = "game", fetch = FetchType.EAGER)
private List<CoopGamesPlayers> players;
}
@Entity
@Table(name = "coop_games_players")
public class CoopGamesPlayers {
@EmbeddedId
private PlayerPK pk;
@JsonBackReference
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "coop_game_id")
private CoopGame game;
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name = "playerid", referencedColumnName = "id"),
@JoinColumn(name = "userid", referencedColumnName = "userid")
})
@MapsId("id")
private Player player;
}
@MapsId("id")
- id 因为你希望玩家 id 为 fk 或?
关于java - 如何创建一个包含原始主键和复合主键作为表复合键的 JoinTable(Spring JPA)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59696440/