【问题标题】:Spring JPA multiply nested tables with complicated relationship M:N and 1:NSpring JPA 将具有复杂关系 M:N 和 1:N 的嵌套表相乘
【发布时间】: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


【解决方案1】:

如果您选择 架构 2 比你不能得到想要的结果,因为学生不能访问课程来评价课程。您期望课程下的评分,但有独立的。

【讨论】:

  • 好收获。但就我而言,这无关紧要。在我的代码中,有一个特殊条件,即用户无需参加课程即可对其进行评分。我选择了一个非常糟糕的例子。看看我提出的新问题:)
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 2013-04-24
  • 1970-01-01
  • 2019-02-10
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多