【发布时间】:2020-04-21 05:21:09
【问题描述】:
我正在尝试构建一个简单的 API,为前端提供一些数据。
我正在努力处理数据库和与 Spring 中实体的关联。让我们一步一步来,让你清楚地了解我需要什么。
我的示例与本课程非常相似:https://www.baeldung.com/jpa-many-to-many。查看3.1 部分。
1) 假设我们有一个student 表和course 表。在它们之间,有一个连接表(我们称之为studentCourseJoin)。好的,这似乎与 Baeldung 网站上的介绍几乎相同。但在我的情况下,我需要有额外的表ratings,它与连接表分开。
并假设学生可以多次评价课程(假设一年一次)
2) 我的目标是拥有这样的数据结构:
{
students: [
{
studentID: 1,
courses: [
{
courseID: 1,
ratings: [{
ratingID: 1,
studentID: 1
}]
}
]
}
]
}
所以,如果我有一个 ID 为 1 的学生,我想列出他的所有课程以及他对给定课程的所有评分(如示例中所示)。
我的评分有问题。因为无论是谁评分,我总是得到给定课程的所有评分。基本上我只缺少一个WHERE 子句。
示例结果:
{
students: [
{
studentID: 1,
courses: [
{
courseID: 1,
ratings: [{
ratingID: 1,
studentID: 1
},{
ratingID: 2,
studentID: 5
}]
}
]
}
]
进行自定义查询并不难。只需大约 3 个JOINs。但这不是我想要的。我想正确设置所有实体,以便 Hibernate 可以自动进行查询、删除孤儿等...
3) 输入数据:studentID: 1(另一种场景:studentID: 1, yearRated: 2020)
4) 我的问题?如何集成ratings 表,以便它应用过滤器WHERE studentId == 1。秒场景WHERE studentId == 1 AND yearRated == 2020
我会在这 2 之间选择什么架构?还是您提出不同的建议?
架构 1
架构 2
我在架构 2 的 rating 表中缺少 FK 定义(忽略它)
我是 Spring JPA 的初学者,所以我缺少一些经验,这可能是一个简单的问题。在本地,我的数据库具有完全不同的名称和更多的列以及完全不同的用途。但我想让这个例子尽可能简单。
现在,假设我有每个表的实体(连接表除外),并且我已经正确配置了与 @ManyToMany 和 @Jointable 装饰器的 M:N 关系
编辑
假设我想使用 Schema 2。问题是,我是否能够创建一个方法名称来自动创建具有所需结果的查询? (第 3 段)。如果有,有什么要求?我是否必须为连接表创建实体以及为复合键创建可嵌入实体?以及如何将rating 表与此连接表连接起来?
编辑 2
我创建了一个新的question,它经过简化,应该更容易理解。
【问题讨论】:
-
当您想知道哪种模式最好的问题时,您必须自己问问题: 1. 学生能否对他不遵循的课程进行评分。 (模式 2 允许这样做) 2. 学生能否对他在某一年没有学习的课程进行评分。 (模式 1 和模式 2 允许这样做)
-
这对我来说并不重要。对我来说最重要的是如何在 Spring 中的每个实体中应用它。将多对一放在哪里(或者具体来说,如何定义它),因为我不知道如何将评级与学生联系起来。是否需要一些复合键?简单地说,是否可以通过正确定义方法名来实现这一点?
-
不同的模式会给出不同的实体。不同的实体需要不同的查询。当您想在 studentId 和 yearRated 上进行选择时,模式 1 需要在选择中加入,而模式 2 不需要。
-
我进行了编辑。这可以理解吗?我的英语有点限制我
-
你不能得到想要的结果,因为学生不能访问课程来评价课程。您期望在课程下的评分,但也有独立的。
标签: java database spring-data-jpa