这是OneToMany JPA的有效使用吗?还是我误解了这个概念



我正在开发一个SpringBoot API,它有2个域JPA实体。其中一个实体是"玩家",它存储有关游戏玩家的信息,并包括自动生成和自动递增的"id"。

"Game"实体存储有关以前玩过的游戏的信息,并具有自动生成和自动递增的id(也称为"gameId"(。

然而,我也想将所有参与该游戏的"玩家"id"存储在"游戏"实体中。

因此,当创建一个游戏对象时,它将需要两个独立玩家实体的"id"。

在这种情况下,一对多关系会起作用吗?玩家在"id"字段上方用@OneToMany进行注释,而游戏在"playerId"字段上方则用@ManyToOne进行注释?

有点像这样:

public class Game {
@Id
@GeneratedValue
private Long gameId;

@ManyToOne()
private Long playerId;
//Should this be multiple different fields like below?
@ManyToOne()
private Long player1Id;
@ManyToOne()
private Long player2Id;
@ManyToOne()
private Long player3Id;
@ManyToOne()
private Long player4Id;
}
public class Player {
@Id
@GeneratedValue
@OneToMany()
private Long id;
private String firstName;
private String lastName;
private String email;
}

这能回答您的问题吗?这使您能够获得加入的玩家的id。

@Entity
public class Game {
@Id
@GeneratedValue
private Long gameId;

@OneToMany(cascade = CascadeType.ALL)
private List<Player> players = new ArrayList<>();
public Game(Long gameId, List<Player> players){
...
}
}
@Entity
public class Player {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String email;
}

但我也建议你阅读关于这个主题的教程。这可能是一种简单的解决方法,但单向一对多映射可能不是最佳实践。应该小心使用。

https://thorben-janssen.com/best-practices-many-one-one-many-associations-mappings/

因此,我建议你使用多对一关系,而不是像下面这样的一对多关系。

@Entity
public class Game {
@Id
@GeneratedValue
private Long gameId;
}
@Entity
public class Player {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
private String email;
@ManyToOne
private Game joinedGame;
}

或者,如果玩家可以在多个游戏中加入,可以考虑中间实体来放松多对多的关系,比如游戏-加入玩家-玩家。

最新更新