Подтвердить что ты не робот

Как создать многого для большого количества спящего режима для дополнительного свойства из таблицы объединения?

Мне нужно много-много карт спящего режима, необходимых для 3-х соединений. Я попытался найти решение без промежуточного объекта, например LecturerCourse.

У меня есть много-много отношений в моей базе данных между моими лекторами и таблицами курсов. Курс может быть предоставлен несколькими лекторами, в то время как лектор может дать несколько курсов.

У меня есть курсы, хранящиеся перед раздачей. Однако мне нужно назначить курсы для лектора. Когда я назначаю курсы, я также сохраняю способность этого курса.

Моя диаграмма базы данных:

enter image description here

Я использую hibernate и spring. Мне нужно спящий режим, когда курс назначается любым лектором. Мне нужно добавить значения в поле емкости.

Мое отображение лектора:

@Entity
@Table(name="LECTURER")
public class Lecturer {

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LECTURER_ID_SEQ")
    @SequenceGenerator(name="LECTURER_ID_SEQ", sequenceName="LECTURER_ID_SEQ")
    private Long Id;

    @Column(name="NAME")
    private String name;

    @Column(name="SURNAME")
    private String surname;


    @Column(name="EMAIL")
    private String email;

    @Column(name="USERNAME")
    private String username;

    @Column(name="PASSWORD")
    private String Password;

    @ManyToMany
    @JoinTable(
          name="LECTURER_COURSE",
          [email protected](name="LECTURER_ID"),
          [email protected](name="COURSE_ID")
      )
    private List<Course> courses;

    //getters - setters
}

Отображение моего курса:

@Entity
@Table(name="COURSE")
public class Course {

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="COURSE_ID_SEQ")
    @SequenceGenerator(name="COURSE_ID_SEQ", sequenceName="COURSE_ID_SEQ")
    private Long id;

    @Column(name="NAME")
    private String name;

    @Column(name="CODE")
    private String code;
}

Любая идея, как решить мою проблему?

4b9b3361

Ответ 1

Для решения этой проблемы необходимо использовать аннотации @EmbeddedId и @Embeddable:

Класс лектора:

@Entity
@Table(name="LECTURER")
public class Lecturer {

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.lecturer", cascade=CascadeType.ALL)
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>();

//all others properties Setters and getters are less relevant.

}

Класс курса:

@Entity
@Table(name="COURSE")
public class Course {

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.course", cascade=CascadeType.ALL)
Set<LecturerCourse> lecturerCourses == new HashSet<LecturerCourse>();

//all others properties Setters and getters are less relevant.

}

LecturerCourse Class:

@Entity
@Table(name = "lecturer_course")
@AssociationOverrides({
        @AssociationOverride(name = "pk.lecturer", 
            joinColumns = @JoinColumn(name = "LECTURER_ID")),
        @AssociationOverride(name = "pk.course", 
            joinColumns = @JoinColumn(name = "COURSE_ID")) })
public class LecturerCourse {

    private LecturerCourseID pk = new LecturerCourseID();

    @Column(name = "CAPACITY", nullable = false, length = 10)
    private String capacity;

    @EmbeddedId
    public LecturerCourseID getPk() {
        return pk;
    }

}

Теперь основной ключ:

@Embeddable
public class LecturerCourseID implements java.io.Serializable {

    private Lecturer lecturer;
    private Course course;

    @ManyToOne
    public Stock getLecturer() {
        return lecturer;
    }

    public void setLecturer(Lecturer lecturer) {
        this.lecturer= lecturer;
    }

    @ManyToOne
    public Course getCourse() {
        return course;
    }

    public void setCourse(Course course) {
        this.course= course;
    }

}

теперь ваша главная должна быть примерно такой:

Lecturer lecturer1 = new Lecturer();
Course math = new Course();
LecturerCourse lecturer1math  = new LecturerCourse();
lecturer1math.setCapacity("capacity");
lecturer1math.setLecturer(lecturer1);
lecturer1math.setCourse(math);
lecturer1.getLecturerCourses().add(lecturer1math);

//saving object
session.save(lecturer1);

Вы должны быть уверены, что класс, помеченный как @Embeddable, должен реализовать интерфейс маркера Serializable.

Надеюсь, что это поможет.