gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:24:14 24 4
gpt4 key购买 nike

我刚开始使用 spring 和 hibernate。我想按照这个Schema来设计数据库

学生、类(class)和学校是实体。 studies_in(Student 和 Class 之间——一对一,student_id 和 class_id 为外键)和 belongs_to(Class 和 School 之间——多对一,class_id 和 school_id 为外键)存在关系。

方法一:

我可以有一个 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;
...

}

类实体也是如此。

方法二:

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

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

如有错误请指正

我该如何处理?

最佳答案

我假设一个学生可以访问多个类(class),一个类(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 困难,具体取决于谁拥有该关系。

同时使用 JoinTable 进行单向关系是 hibernate aproach 推荐的。当您不确定一个关系是 OneToOne、OneToMany 还是 ManyToMany 时,当您拥有连接表时可以轻松扩展它时,它也更可扩展。

关于mysql - 如何将关系表建模为 Hibernate 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54720902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com