JPA: разделить один столбец между несколькими сопоставлениями FK
Как я могу разделить столбец между двумя FK одной справочной таблицы? У меня есть четыре объекта: игрок, команда, TeamPlayer и PlayerScore.
Теперь вот пример использования:
Каждый игрок с битой в крикете (извините за неглобальный пример), играющий за определенную команду, будет забивать, когда у него есть партнер-игрок с битой, называемый бегуном. Теперь объект PlayerScore должен получить эту информацию. Поэтому я должен убедиться, что и игрок с битой, и его партнер играют за одну команду. Я могу использовать эту таблицу, чтобы понять, какие пары игроков с битой показали лучшие результаты. Точнее говоря, мне нужны две ссылки от PlayerScore на сущность TeamPlayer. У них обоих ровно одна колонка, команда. Как мне этого добиться?
Вот четыре класса:
@Entity
@Table(name="team")
public class Team {
@Id
private int id;
@Column(name="name",length=50)
private String name;
}
@Entity
@Table(name="player")
public class Player {
@Id
private int id;
@Column(name="name",length=50)
private String name;
}
@Entity
@Table(name="team_player")
public class TeamPlayer {
@EmbeddedId
private TeamPlayerPK id;
@ManyToOne(targetEntity=Player.class)
@JoinColumn(name="player")
private Player player;
@ManyToOne(targetEntity=Team.class)
@JoinColumn(name="team")
private Team team;
@Column(name="name",length=50)
private String name;
@Embeddable
public static class TeamPlayerPK implements Serializable
{
private static final long serialVersionUID = 1L;
private int team;
private int player;
}
}
@Entity
@Table(name="player_score")
public class PlayerScore {
@Id
private int scoreId;
@ManyToOne(targetEntity=TeamPlayer.class)
@JoinColumns(value={@JoinColumn(name="team",referencedColumnName="team"),@JoinColumn(name="batsmen",referencedColumnName="player")})
private TeamPlayer batsman;
@ManyToOne(targetEntity=TeamPlayer.class)
@JoinColumns(value={@JoinColumn(name="team",referencedColumnName="team"),@JoinColumn(name="runner",referencedColumnName="player")})
private TeamPlayer runner;
private int score;
@Temporal(TemporalType.DATE)
private Date matchDate;
}
РЕДАКТИРОВАТЬ 1: Добавлена модель Mysql WB, как предложено в комментарии
РЕДАКТИРОВАТЬ 2: Первая неудачная попытка:
Объекты Team и Player остаются такими же, как указано выше. Но TeamPlayer был изменен следующим образом:
@ManyToOne(targetEntity=Player.class)
@PrimaryKeyJoinColumn(name="player",referencedColumnName="id")
private Player player;
@JoinColumn был изменен на @PrimaryKeyJoinColumn
Аннотации для поля бегуна в сущности PlayerScore изменяются следующим образом:
@ManyToOne(targetEntity=TeamPlayer.class)
@JoinColumns(value={@JoinColumn(name="team",referencedColumnName="team",insertable=false,updatable=false),@JoinColumn(name="runner",referencedColumnName="player",insertable=true,updatable=true)})
private TeamPlayer runner;
Ожидается, что ссылка FK для бегуна также генерируется. Код компилируется, и Eclipselink проходит генерацию, но внешний ключ для бегуна НЕ генерируется. В поисках успеха еще...