получение ошибки при создании отношений между сущностями JPA - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать сущности, но я получил следующую ошибку:

Internal Exception: Exception [EclipseLink-7157] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Entity class [class application.Team] must use a @JoinColumn instead of @Column to map its relationship attribute [mPlayers].

Это мои сущности, мне нужно хранить данные в базе данных, используя Java Persistence API (JPA). Для этого я создаю объекты следующим образом. Возможно, я создал отношения между сущностями неправильно.

Персона

@MappedSuperclass
public class Person {
 @Id
 @GeneratedValue( strategy= GenerationType.AUTO )
 protected int p_id;

 protected String firstName;
 protected String middleName;
 protected String lastName;
 protected String phone; 
 protected String email;

 public Person() {
 }
}

Игрок

    @Entity
@Table( name = "tbl_players")
@AttributeOverride(name="id", column=@Column(name="player_id"))
public class Player extends Person implements Serializable{
    private int player_id;

    @Column(name = "goals_in_year")
    private int numberOfGoalsInCurrentYear;

    private boolean goalie;

    @Column(name = "defended_goals")
    private int defendedGoals;

    public Player(){

    }
 }

Менеджер

@Entity
@Table( name = "tbl_manager")
@AttributeOverride(name="id", column=@Column(name="manager_id"))
public class Manager extends Person implements Serializable{
    private String dob;
    private int starRating;

    @OneToOne
    private Team teamToManage;

    public Manager(){
    }
}

Команда

@Entity
@Table( name = "tbl_team")
public class Team implements Serializable {
    @Column(name = "team_name")
    @Id
    String teamName;

    @OneToOne
    Manager manager;

    @Column(name = "team_players")
    @OneToMany
    private List<Player> mPlayers = new ArrayList<>();

    @Column(name = "jersey_color")
    String jerseyColor;

    public Team(){
    }
}

Лига

@Entity
public class League {
    @Id
    private int league_id;

    @OneToMany
    @Column(name = "League Teams")
    private List<Team> mTeam = new ArrayList<>();

    public void addTeam(Team team) {
        mTeam.add(team);
    }

    public void removeTeam(Team team) {
        mTeam.remove(team);
    }
}

Ответы [ 4 ]

1 голос
/ 02 мая 2020

Используйте @JoinColumn для сопоставления (@OneToMany, @ManyToMany, @ManyToOne) вместо @Column. @Column используется для указания сопоставленного столбца для постоянного свойства или поля.

0 голосов
/ 02 мая 2020

Игрок

@Entity
@Table( name = "tbl_players")
@AttributeOverride(name="id", column=@Column(name="player_id"))
public class Player extends Person implements Serializable{
    private int player_id;

    @Column(name = "goals_in_year")
    private int numberOfGoalsInCurrentYear;

    private boolean goalie;

    @Column(name = "defended_goals")
    private int defendedGoals;

    @OneToOne // or @OneToMany as you desire
    @JoinColumn(name="team_name") // here the name you have given to the column in tbl_players
    private Team team;

    public Player(){

    }
 }

Менеджер

@Entity
@Table( name = "tbl_manager")
@AttributeOverride(name="id", column=@Column(name="manager_id"))
public class Manager extends Person implements Serializable{
    private String dob;
    private int starRating;

    @OneToOne(mappedBy="manager")
    private Team teamToManage;

    public Manager(){
    }
}

Команда

@Entity
@Table( name = "tbl_team")
public class Team implements Serializable {

    @Id
    @Column(name = "team_id")
    private int id;    

    @Column(name = "team_name")
    String teamName;

    @OneToOne
    @JoinColumn(name="manager_id")
    Manager manager;

    @Column(name = "team_players")
    @OneToMany(mappedBy="team")
    private List<Player> mPlayers = new ArrayList<>();

    @Column(name = "jersey_color")
    String jerseyColor;

    @ManyToOne(mappedBy="")
    private League league;

    public Team(){
    }
}

Лига

@Entity
@Table( name = "tbl_league")
public class League {

    @Id
    @Column(name="league_id")
    private int league_id;

    @OneToMany
    @JoinTable(name="tbl_league_teams",joinColumns=@JoinColumn(name = "league_id"), inverseJoinColumns=@JoinColumn(name = "team_id"))
    private List<Team> mTeam = new ArrayList<>();

    public void addTeam(Team team) {
        mTeam.add(team);
    }

    public void removeTeam(Team team) {
        mTeam.remove(team);
    }
}

Создание новой таблицы сопоставления промежуточных элементов с именем tbl_league_teams со столбцами league_id и team_id, чтобы упростить сущность @JoinTable в League для сопоставления между командами в лиге.

0 голосов
/ 02 мая 2020

Почему вы не рассматриваете каждый класс модели как объект, а затем присоединяетесь к модели, используя ManyToOne или OneToMany

0 голосов
/ 02 мая 2020

Кажется, это связано с @Column (name = "team_players") и @OneToManyPlease

Пожалуйста, прочитайте ссылку { ссылка }

...