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

时间:2019-02-16 07:33:38

标签: mysql hibernate spring-mvc hibernate-mapping entity-relationship

我是第一次使用spring和hibernate。 我想根据此Schema

设计数据库

学生,班级和学校都是实体。存在关系Studies_in(在学生和班级之间,一对一,以student_id和class_id为外键)和belongs_to(在班级和学校之间,多对一,以class_id和school_id为外键)。

方法1:

我可以按如下方式安排学生班:

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

然后为study_in创建课程。

关系的先前方法在应用程序级别中存在,而在此方法中,它物理上存在于数据库中。 我认为第二种方法更好,因为可以对数据库进行规范化,但是我不知道如何在春季实现它。

如果我错了,请纠正我。

我该如何进行?

1 个答案:

答案 0 :(得分:1)

我假设一个学生可以参观很多班,而一个班级可以有很多学生。因此,正确的关系将是此处的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方面遇到困难,具体取决于谁拥有该关系。

休眠方式也建议将JoinTable用于单向关系。当您不确定拥有联接表时某个关系是OneToOne,OneToMany还是ManyToMany时,它也可以扩展,您可以轻松地扩展它。