【问题标题】:How to model relationship tables as entities in Hibernate如何在 Hibernate 中将关系表建模为实体
【发布时间】:2019-07-10 06:43:28
【问题描述】:

我是使用 spring 和 hibernate 的新手。 我想按照这个Schema设计数据库

学生、班级和学校是实体。存在关系 Studies_in(Student 和 Class 之间 - 一对一,student_id 和 class_id 作为外键)和 belongs_to(Class 和 School 之间 - 多对一,class_id 和 school_id 作为外键)。

方法一:

我可以有一个班级学生如下:

@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 中实现它。

如果我错了,请纠正我。

我该如何处理?

【问题讨论】:

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


    【解决方案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 关系可能会在延迟加载时遇到困难,具体取决于谁拥有该关系。

    hibernate 方法推荐使用 JoinTable 进行单向关系。当您不确定一个关系是否是 OneToOne、OneToMany 或 ManyToMany 时,它也更具扩展性,您可以轻松地扩展它。

    【讨论】:

    • 非常感谢您帮助我解决这个问题@Alexandar Petrov
    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多