我是第一次使用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创建课程。
关系的先前方法在应用程序级别中存在,而在此方法中,它物理上存在于数据库中。 我认为第二种方法更好,因为可以对数据库进行规范化,但是我不知道如何在春季实现它。
如果我错了,请纠正我。
我该如何进行?
答案 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时,它也可以扩展,您可以轻松地扩展它。