【问题标题】:Is this a valid use for OneToMany JPA or am I misunderstanding this concept?这是 OneToMany JPA 的有效用途还是我误解了这个概念?
【发布时间】:2021-12-21 16:09:55
【问题描述】:

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

“游戏”实体存储有关以前玩过的游戏的信息,并具有自动生成和自动递增的 id 以及“gameId”。

但是,我还想将参与该游戏的所有“玩家”“id”存储在“游戏”实体中。

因此,当一个 Game 对象被创建时,它需要 2 个单独的 Player 实体的“id”。

在这种情况下,OneToMany 关系是否有效?哪里 Player 在 'id' 字段上方用 @OneToMany 注释,而 Game 在 '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;
}

【问题讨论】:

  • 我建议阅读有关该主题的教程,例如this one from baeldung.com
  • 我会说玩家 游戏是多对多
  • @SimonMartinelli 是的,这更有意义,这就是为什么当我尝试实现它时,我意识到每个玩家只能玩 1 场比赛,谢谢!
  • 您缺少 Hibernate ORMObject 部分!就像@Turing85 所说,您绝对应该从基础开始。如果你不喜欢 baeldung.com,Vlad Mihalcea 也有很好的教程。
  • “但是,我还想将参与该游戏的所有 'Players' 'id' 存储在 'Game' 实体中。” ... 在关系数据库中,您不会像“数据之间的关系”那样考虑“将数据存储在某物中”。事实上,在 RDBMS 中建立关系而不将任何数据从一个数据集“存储”到另一个数据集(即使用桥接表或联结表)是完全正常的。

标签: java spring spring-boot jpa spring-data-jpa


【解决方案1】:

这是否回答了您的问题? 这使您能够获得加入的玩家的 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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多