Можно ли добавить дополнительные поля в дополнительную таблицу @ManyToMany Hibernate?

У меня такая же ошибка, потому что я пытался запустить свою программу без запуска сервера mysql.

После запуска сервера mysql все пошло правильно.

14
задан Am1rr3zA 17 June 2012 в 12:43
поделиться

3 ответа

Если вы добавляете дополнительные поля в связанную таблицу (STUDENT_COURSE), вы должны выбрать подход в соответствии с ответом Скаффмана или другим, как показано ниже.

Существует подход, в котором связанная таблица (STUDENT_COURSE) ведет себя как @Embeddable в соответствии с:

@Embeddable
public class JoinedStudentCourse {

    // Lets suppose you have added this field
    @Column(updatable=false)
    private Date joinedDate;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="STUDENT_ID", insertable=false, updatable=false)
    private Student student;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="COURSE_ID", insertable=false, updatable=false)
    private Course course;

    // getter's and setter's 

    public boolean equals(Object instance) {
        if(instance == null)
            return false;

        if(!(instance instanceof JoinedStudentCourse))
            return false;

        JoinedStudentCourse other = (JoinedStudentCourse) instance;
        if(!(student.getId().equals(other.getStudent().getId()))
            return false;

        if(!(course.getId().equals(other.getCourse().getId()))
            return false;

        // ATT: use immutable fields like joinedDate in equals() implementation
        if(!(joinedDate.equals(other.getJoinedDate()))
            return false;

        return true;
    }

    public int hashcode() {
        // hashcode implementation
    }

}

Таким образом, у вас будет как в классе Student, так и в курсе

public class Student {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="STUDENT_COURSE"),
        joinColumns=@JoinColumn(name="STUDENT_ID")
    )
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>();

}

public class Course {

    @CollectionOfElements
    @JoinTable(
        table=@Table(name="STUDENT_COURSE"),
        joinColumns=@JoinColumn(name="COURSE_ID")
    )
    private Set<JoinedStudentCourse> joined = new HashSet<JoinedStudentCourse>();

}

, помните: у класса @Embeddable свой жизненный цикл привязан к классу объекта-владельца (как Student, так и Course), поэтому возьмите позаботьтесь об этом.

совет: команда Hibernate поддерживает эти два подхода (@OneToMany (ответ скаффмана) или @CollectionsOfElements) из-за некоторых ограничений в отображении @ManyToMany - каскадная операция.

с уважением,

16
ответ дан 1 December 2019 в 09:33
поделиться

Таблица student_course предназначена исключительно для записи ассоциации между двумя объектами. Он управляется спящим режимом и не может содержать никаких других данных.

Тип данных, которые вы хотите записать, должен быть смоделирован как другой объект. Возможно, вы могли бы связать один-ко-многим между Course и StudentResult (который содержит оценку и т. Д.), А затем связать один-ко-многим между StdentResult и Student.

7
ответ дан 1 December 2019 в 09:33
поделиться

Отбросьте "многие-ко-многим", создайте класс под названием StudentCourseRelationship и настройте один на manys на Student, а курс на StudentCourseRelationship.

Вы можете помещать в него все, что угодно, такие как DateEnrolled, DateKickedOut и т. д. и т. д.

ИМО, отображение «многие ко многим» - это своего рода недостаток.

3
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: