Как использовать несколько внешних ключей в JPA? - PullRequest
0 голосов
/ 19 апреля 2020

Я начинаю проект, чтобы узнать более подробно JPA.

Контекст: По окончании стажировки у студента должен быть отчет и презентация перед его профессором о Интернатура.

У меня есть база данных, которая называется "grade_management". Он должен содержать таблицу «студент», «презентация», «отчет», «профессор» и «оценка» (есть несколько критериев оценки, таких как выражение, качество powerpoint ...). Но теперь он пуст, так как я хочу сделать это через JPA.

У меня есть класс "Presentation". Какой источник это:

@Entity
public class Presentation implements Serializable {
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
private int presentation_id;
private Date date;
private mark_id;
private int professor_id;

public Soutenance() {}

public Soutenance(Date date) {
    this.date = date;
}
}

Но в таблице Presentation содержится 2 внешних ключа: Professor_id и mark_id. У меня вопрос: Как я могу указать, что оба они являются внешним ключом?

Извините, если мне не ясно, не стесняйтесь задать вопрос.

Сердечно

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Из вашего объяснения похоже, что у вас есть база данных с именем grade_management, и в этой базе данных у вас есть "student", "presentation", "report", "professor" and a "mark" таблицы (то есть: которые @Entity сами по себе определены в своих отдельных соответствующих классах)

Я не уверен, что вы определили их или нет. Если нет, то вы должны сначала определить их, а затем использовать рефакторинг кода, упомянутый ниже.

Итак, вы будете иметь отношение многие-к-одному. Вы можете аннотировать свои внешние ключи, принадлежащие к разным таблицам, используя аннотацию @ManyToOne, чтобы указать тип отношения, и аннотацию @JoinColumn, чтобы указать, что у этой сущности есть внешний ключ к указанной таблице.

Вы можете переопределить свой класс Presentation. покажите ниже:

@Entity
@Table(name = "Presentation")
public class Presentation implements Serializable {
    @Id
    @Column(name="presentation_id")
    @GeneratedValue (strategy=GenerationType.AUTO)
    private int presentation_id;
    private Date date;

    @ManyToOne
    @JoinColumn(name = "mark_id")   
    private Mark mark_id;

    @ManyToOne
    @JoinColumn(name = "professor_id")  
    private Professor professor_id;

    public Soutenance() {}

    public Soutenance(Date date) {
        this.date = date;
    }
    //getter and setter 
}

Кроме того, если вам нужна дополнительная информация для чтения, вы всегда можете проверить эту документацию Hibernate , которая объясняет все, что вам нужно знать.

0 голосов
/ 19 апреля 2020

Вы не должны ссылаться на другие сущности по их идентификатору, но по прямой ссылке на сущность.

Примерно так:

@ManyToOne
@JoinColumn(name = "mark_id", referencedColumnName = "id")
private Mark mark; // supposed here that mark_id if link to entity `Mark`

@ManyToOne
@JoinColumn(name = "professor_id", referencedColumnName = "id") // suppose "id" is the column name of the PK inside the table Professor.
private Professor professor; // supposed here that professor_id if link to entity `Professor`

Этот код предполагает, что вы используете однонаправленное отношение. Для двунаправленного вы должны определить это с другой стороны (тип Mark / Professor)

@OneToMany(mappedBy = "professor")
private Presentation presentation;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...