В вашей модели вы хотите соотношение 1-1 между вашей игрой и вашим игроком. Но два игрока будут совместно использовать игру, поэтому на один игровой идентификатор можно сослаться несколько раз с игрового стола, но на одного игрока можно ссылаться только один раз с игрового стола.
Единственное, что вы ошиблись, это использование атрибута mappedBy
, который должен использоваться на стороне, не являющейся владельцем отношения. Он сообщает JPA «На меня ссылаются из этого внешнего ключа в другой таблице. Пожалуйста, принесите его мне и укажите здесь ». Помните, что вам придется поддерживать обе стороны отношения, то есть, когда вы звоните game.setPlayer(player)
, вы также должны убедиться, что вы звоните player.setGame(game)
. Также обратите внимание, что, хотя это, вероятно, нормально для отношений @OneToOne, это не масштабируется, и вам лучше избегать его использования.
Ваши отношения между игроками и игроками определяются их выравниванием. Фактически, ваша сущность игрока, кажется, определяет отношение между пользователем и игрой.
Решение, которое я бы выбрал для вашего варианта использования, состояло бы в том, чтобы использовать таблицу GamePosition
, которая позволит вам обеспечить одиночный игрок - только часть одной игры.
@Entity
@Table(name = "players")
public class Player {
@ManyToOne
@JoinColumn(name="user_id", nullable=false)
private User user;
}
@Entity
@Table(name = "game")
public class Game {
@Id @GeneratedValue
private int id;
}
@Entity
@Table(name = "game_position")
public class GamePosition {
@OneToOne
@JoinColumn(name="player_id", unique=true)
// Making this column unique will prevent a single player to be part of two games
private Player player;
@ManyToOne
@JoinColumn(name="game_id")
private Game game;
@Enumarated
private Alignement alignement;
}
Тогда, если вы хотите двунаправленные отношения, вы можете использовать атрибут mappedBy. На игровом столе:
@OneToOne(mappedBy="player")
private GamePosition gamePosition;
или на игровом столе:
@OneToMany(mappedBy="game")
private List<GamePosition> gamePositions;