Как моделировать таблицы отношений как сущности в Hibernate - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в использовании Spring и Hibernate.Я хочу создать базу данных в соответствии с этой схемой

Учащийся, класс и школа являются юридическими лицами.Существуют отношения Studies_in (между Student и Class - один к одному, с student_id и class_id в качестве внешних ключей) и own_to (между Class и School - многие к одному, с class_id и school_id в качестве внешних ключей).

Метод 1:

У меня может быть класс Student следующим образом:

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

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    ...

    @OneToOne
    @JoinColumn(name="class_id")
    private Class class;
    ...

}

И аналогично для класса.

Метод 2:

Это правильный способ сделать это или я должен представлять отношения в виде таблиц, создавая их с помощью SQL-запросов следующим образом:

create table studies_in(student_id int, class_id int, 
                        primary key(student_id,class_id), 
                        foreign key(student_id) references student(id),
                        foreign key(class_id) references class(id));

И затем создайте класс дляStudies_in.

В предыдущем методе связь существует на уровне приложения, тогда как в этом методе она существует физически в базе данных.Мне кажется, что второй подход лучше, поскольку база данных будет нормализована, но я не знаю, как реализовать это весной.

Пожалуйста, исправьте меня, если я ошибаюсь.

Какпродолжить с этим?

1 Ответ

0 голосов
/ 16 февраля 2019

Я предполагаю, что один ученик может посетить много классов, а в одном классе может быть много учеников.Таким образом, правильное соотношение было бы здесь ManyToMany, и использование JoinTable действительно имеет смысл.

@ManyToMany
@JoinTable(name="studies_in" , joinColumns={@JoinColumn(name="class_id", referencedColumnName="id")}, inverseJoinColumns={ @JoinColumn(name="student_id", referencedColumnName="id") )
private Class class;

Использование JoinTable имеет определенные преимущества в отношении кеширования, а также отложенной загрузки.Например, отношение OneToOne, если не используется инструментарий, может иметь проблемы с LazyLoading в зависимости от того, кто является владельцем отношения.

Кроме того, hibernate aproach рекомендует использовать JoinTable для однонаправленных отношений.Это также более расширяемо, когда вы не уверены, будет ли одно отношение OneToOne, OneToMany или ManyToMany, если у таблицы объединения есть возможность расширить ее.

...