Как объединить промежуточную таблицу в отображениях ManyToMany в спящем режиме - PullRequest
0 голосов
/ 17 февраля 2020

Есть ли способ присоединиться к промежуточной таблице в таблице ManyToMany. Вы можете рассмотреть пример, приведенный в https://dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-many-to-many-using-annotations-1.html

enter image description here

В качестве примера в приведенных выше Student до Course отношение многие ко многим, у нас могут быть таблицы STUDENT, COURSE и STUDENT_COURSE.

Мой вопрос состоит в том, чтобы проверить, есть ли какой-нибудь способ, которым мы можем предоставить это в спящем режиме в java, чтобы Student класс имеет отображение для STUDENT_COURSE промежуточной таблицы вместо COURSE таблицы?

Я хочу изменить приведенный ниже класс, чтобы получить приведенный выше вывод: -

@Entity
@Table(name = "STUDENT")
public class Student {

    private long studentId;
    private String studentName;
    private Set<Course> courses = new HashSet<Course>(0);

    public Student() {
    }

    public Student(String studentName) {
        this.studentName = studentName;
    }

    public Student(String studentName, Set<Course> courses) {
        this.studentName = studentName;
        this.courses = courses;
    }

    @Id
    @GeneratedValue
    @Column(name = "STUDENT_ID")
    public long getStudentId() {
        return this.studentId;
    }

    public void setStudentId(long studentId) {
        this.studentId = studentId;
    }

    @Column(name = "STUDENT_NAME", nullable = false, length = 100)
    public String getStudentName() {
        return this.studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "STUDENT_COURSE",
               joinColumns = { @JoinColumn(name = "STUDENT_ID") },
               inverseJoinColumns = { @JoinColumn(name = "COURSE_ID") })
    public Set<Course> getCourses() {
        return this.courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }
}

1 Ответ

1 голос
/ 17 февраля 2020

Краткий ответ:

Вы должны разделить ассоциацию «многие ко многим» на ассоциацию «два к одному» и использовать аннотацию @Embedded для определения составного ключа для промежуточной сущности. Подробную информацию смотрите по ссылке ниже

https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/

Длинный ответ:

На самом деле, когда вы используете аннотацию @ManyToMany для установления sh связи многих со многими в спящем режиме, создается еще одна таблица для установки sh Ассоциация ManyToMany за сценой, эта таблица определена с помощью аннотации @JoinTable в вашем коде, запрос к этой таблице полностью управляется hibernate для достижения связи между многими, и у вас нет сущности, которая сопоставлена ​​с этой таблицей. Это нормально, если вам не нужен дополнительный столбец в промежуточной таблице (здесь STUDENT_COURSE) или если вы хотите выполнить какой-то конкретный c запрос к этой таблице таким образом, чтобы вы вели себя с другой сущностью и не хотели получить доступ к идентификатору вашего курса и ученический стол в CourseStudent. потому что, когда hibernate создает промежуточную таблицу за сценой, в вашей программе нет сущности, которая сопоставляется с этой таблицей, и поэтому у вас не может быть другого столбца для этой таблицы, и вы не можете вести себя с этой таблицей как с сущностью в вашей программе. , если вам нужен дополнительный столбец, вы можете разделить свою ассоциацию @ManyToMany на две ассоциации @ManyToOne. Здесь у вас должна быть другая сущность с именем StudentCourse, у которой есть две ассоциации @ManyToOne, одна с сущностью Student, а другая с сущностью Course. Однако, когда вы определяете ассоциацию «многие ко многим» таким образом, вы должны учитывать интеграцию данных, например, комбинация student_id и course_id в вашей таблице student_course является уникальной и фактически она должна быть составным ключом в вашей таблице student_course. К счастью, есть некоторые аннотации в hibernate и jpa, которые предоставляют эту возможность. Написание всего кода для этой ситуации в этом ответе является излишним, поскольку в приведенной ниже ссылке уже есть хороший пример.

https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/

...