如何将关系表建模为 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 时,您可以轻松扩展它。
我刚开始使用 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 时,您可以轻松扩展它。