Связь ManyToOne запутался совсем

Я только пробую работать с БД, поэтому сильно не ругайтесь.

У меня есть БД, в одной таблице описаны студенты, во второй их группы, причем студент может находиться ни в одной из групп, а может быть сразу в нескольких :

group {
id,
name
}
student {
id, 
name,
group_id 
}

Создал две сущности :

GroupEntity {
    private Long id;
    private String name;
    @OneToMany(mappedBy = "groupEntity")
    private List<StudentEntity> studentList = new ArrayList<>();
}

StudentEntity {
    private Long id;
    private String name;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "group_id")
    private GroupEntity groupEntity;    
}

И тут я понял, что что-то не так. По моей структуре БД студент может быть только в одной группе, а сущности вроде как я создал правильно. Как мне исправить структуру БД?

И правильно ли я описал связи таблиц в сущностях?

Вот тут есть пример: Примеры записи аннотаций @OneToMany @OneToOne @ManyToMany Одни в один мой пример : у поста может быть много комментариев (@OneToMany). Как они это реализовали с помощью двух таблиц в БД? И обошлись без ManyToMany.


Ответы (1 шт):

Автор решения: Zhenyria

У вас в данном случае ManyToMany. Необходимо аннотировать классы следующим образом:

GroupEntity {
    @ManyToMany(mappedBy = "groupEntities")
    private Set<StudentEntity> students;
}

StudentEntity {
    @ManyToMany
    @JoinTable(
        name = "student_entities_groups",
        joinColumns = @JoinColumn(name = "student_entity_id"),
        inverseJoinColumn = @JoinColumn(name = "group_id")
    )
    private Set<GroupEntity> groupEntities;    
}

Вам потребуется три таблицы для такой связи. Одна для студентов, вторая для групп, а третья будет соединять их. Этой таблицей в данном случае является student_entities_groups. Эта таблица будет содержать две колонки: id студента и id группы (обратите внимание, что у записей в таблице связей не будет собственных id, только FK на связываемые сущности).

При работе с сущностями, участвующими в отношениях ManyToMany, могут возникать некоторые интересные моменты. Подробнее об этом в моём ответе к другому вопросу. Если в двух словах, то несмотря на то, что в ManyToMany формально обе сущности имеют одинаковые права в отношении друг-друга, фактически владельцем связи является та сущность, в которой находится аннотация @JoinTable.

→ Ссылка