对于两列(实体类中两个相同类型的字段)一对一休眠]]

问题描述 投票:0回答:2

游戏

id    crosses_player_id    noughts_player_id...

玩家

id    alignment    game_id

由于只有2个玩家,我不需要创建一个单独的表,所以我这样做是这样的:

@Entity
@Table(name = "games")
public class Game {
    @Id @GeneratedValue
    private int id;

    @OneToOne(mappedBy = "game")
    @JoinColumn(name = "crosses_player_id")
    private Player crossesPlayer;
    @OneToOne(mappedBy = "game")
    @JoinColumn(name = "noughts_player_id")
    private Player noughtsPlayer;

    private List<Move> moves = new ArrayList<>();
    private List<Field> fields = new ArrayList<>();
...
@Entity
@Table(name = "players")
public class Player {
    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    private User user;

    private enum Alignment {
        NOUGHTS, CROSSES
    };
    private Alignment alignment;

    @OneToOne(mappedBy = ?)
    private Game game;
...

但是我不确定在@OneToOne(mappedBy = ?)类的Player中放入什么。

我找到的最接近的答案是这个:

https://stackoverflow.com/a/13944195/4759176

class TeamPlay {
    @ManyToOne
    Team homeTeam;

    @ManyToOne
    Team awayTeam;
}

class Team {
    @OneToMany(mappedBy="homeTeam")
    Set<TeamPlay> homeTeamPlays;

    @OneToMany(mappedBy="awayTeam")
    Set<TeamPlay> awayTeamPlays;
}

但是Team类可能有很多可能的游戏,而在我的情况下,一位玩家只有1个游戏。玩家基本上就是用户的ID,游戏的ID和所处的高度(无棋或十字),并且在游戏结束后,再也不会从任何新游戏中再次引用同一位玩家。也许我应该这样:

玩家

@OneToOne(mappedBy = "crossesPlayer")
private Game crossesGame;

@OneToOne(mappedBy = "noughtsPlayer")
private Game noughtsGame;

但是,一个玩家可以only

不存在,也可以是十字架玩家,因此这些字段之一始终为空吗?

假设我有一个Noughts and Crosses游戏(井字游戏):游戏:id crosses_player_id noughts_player_id ...玩家:id对齐game_id因为只有2个玩家,所以我认为没有必要...

java hibernate hibernate-mapping
2个回答
0
投票
@@ parsecer ...对我来说,您的问题在于对数据模型的误解;引用你:

0
投票
@ManyToOne(optional=false) @JoinColumn(name="game_id") private Game game;
© www.soinside.com 2019 - 2024. All rights reserved.