如何将关系表建模为 Hibernate 中的实体

How to model relationship tables as entities in Hibernate

我刚开始使用 spring 和休眠。 我想按照这个Schema

设计数据库

学生,Class和学校是实体。存在关系 studies_in(在 Student 和 Class 之间 - 一对一,以 student_id 和 class_id 作为外键)和 belongs_to(在 [=46= 之间) ] 和 School - 多对一,class_id 和 school_id 作为外键)。

方法一:

我可以有一个 class 学生如下:

@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;
    ...

}

对于 Class 实体也是如此。

方法二:

这是正确的方法吗,还是我应该将关系表示为表,通过 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 创建 class。

以前的方法关系存在于应用程序级别,而在这种方法中它物理存在于数据库中。 我觉得第二种方法更好,因为数据库会被规范化,但我不知道如何在 spring.

中实现它

如有错误请指正

我该如何处理?

我假设一个学生可以访问很多 classes 而一个 class 可以有很多学生。所以这里正确的关系应该是 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 时,它也更可扩展,当您加入 table 时,您可以轻松扩展它。