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 проходит генерацию, но внешний ключ для бегуна НЕ генерируется. В поисках успеха еще...

0 ответов

Другие вопросы по тегам