当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA能否通过@JoinColumn强制实现多通关系

方增
2023-03-14

我有一个使用Spring Data REST和Spring Data JPA的Spring Boot应用程序。我有两个域实体:学生和教室,许多学生可以属于同一个教室。

学生:

@Data
@Entity
@Table(name = "STUDENT")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STUDENT_ID")
    private Integer studentId;  // This Id has been setup as auto generated in DB

    @Column(name = "ROOM_ID")
    private Integer roomId;

    @ManyToOne
    @JoinColumn(name = "ROOM_ID", nullable = false, updatable = false, insertable = false)
    private Classroom classroom;
   }

教室:

@Data
@Entity
@Table(name = "CLASSROOM")
public class Classroom {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ROOM_ID")
    private Integer roomId;  // This Id has been setup as auto generated in DB

    @OneToMany(mappedBy = "classroom")
    private List<Student> studentList;

    .....// other fields related to a classroom
  }

和学生知识库:

public interface StudentRepository extends CrudRepository<Student , Integer>{
  List<Student> findByClassroom(@Param("room") Classroom room);
}

课堂知识库:

public interface ClassroomRepository extends CrudRepository<Classroom , Integer>{
}

我有一个SpringApplication主文件,但没有控制器。

教室表中已经有一个房间id为1的教室。当我发出以下请求时http://localhost:8080/students,在学生表中创建了一个新的学生记录,我预计它会失败,因为教室中不存在id=100的教室。

所以我的问题是:Spring Data JPA可以强制执行manyToOne关系吗?或者这个外键强制必须在数据库端完成(出于合理考虑,我们的DBA没有将学生表中的非空ROOM_ID列定义为外键)。如果必须在数据库端完成,那么在实体文件中定义manyToOne关系有什么意义?

另外,我知道我在“学生”实体中有多余的教室字段,我只是不知道在“学生”实体中保留哪个字段(房间ID还是“教室”字段),因为当我创建学生时,我只想在请求中给出教室的房间ID。谢谢!

{ 
  "roomId": 100  // I expect this request to fail because no roomId=100 in the CLASSROOM table.
}

共有1个答案

戚育
2023-03-14

在实体文件中定义多通关系的意义是什么

因为是一个对象关系映射工具,允许您定义实体图。

您当前正在传递room Id,它在您的实体中只是另一个字段,因此您需要删除它。

@Entity
@Table(name = "STUDENT")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "STUDENT_ID")
    private Integer studentId;  // This Id has been setup as auto generated in DB

    @ManyToOne
    @JoinColumn(name = "ROOM_ID", nullable = false)
    private Classroom classroom;
}

然后,在Spring Data Rest中,通过传递引用实体的自链接来定义关联。

{ 
  "classroom" : "http://localhost:8080/classrooms/1"
}

还可以在发布新记录时删除ID,并且如您所知,ID是在数据库中自动生成的。

另请参见:

https://www.baeldung.com/spring-data-rest-relationships

 类似资料:
  • 对于方法,如果我发送空白,它可以工作,但值为null。而且,要搜索的字段太多了。所以我正在寻找一种更好的方法来搜索这样的表单。在Grails框架中,我可以为此创建名称,但在中没有找到更好的方法。 有什么想法吗?谢了。

  • 在我的Spring数据应用程序中,我遇到了这里描述的类似问题ClassCastException:在尝试迭代实体ID时,Integer不能强制转换为Long 我正在接收- 我正在接收-

  • 问题内容: 我正在尝试使用JPA 2.0创建具有通用关系的多态实体。应该有两个表,一个事件表和一个通知表。在这些表内是彼此相关的具体实体,如下所示: 从逻辑上讲,这应该在hibernate状态下是可能的,因为在SQL中是可能的: 这就是我所拥有的: 使用此代码,我可以持久保存并获取任何Event,Notification,LoginEvent或NotificationEvent,但是当我尝试在JP

  • 我有3个模型在我的项目: 用户型号代码: 职业标准守则 迁移: 用户职业模型代码 迁移: 当我尝试这个代码时,我通过他的名字搜索用户,并得到职业名称,然后计算该职业的用户。 代码: 我收到错误消息: 照明\数据库\查询异常:SQLSTATE[23000]:完整性约束违反:1052列'id'在其中子句是含糊不清的(SQL:选择*从存在的职业(选择*从用户内连接user_professionsuser

  • 在我的遗留应用程序中,我有一个国家表、状态表和一个国家和州的映射表,几乎没有额外的列。 我创建了这样一个实体类。 我的仓库。 我想检查映射表中是否存在状态。以下两种方法都不起作用。 正确的方法是什么?

  • 我正在用Java开发一个使用JPA的路线规划系统。我需要创建一个findBy方法,通过包含它的城市列表来查找路线。以下是课程: 现在我尝试了,但并不惊讶它不起作用,如下所示: 有没有一种简单的方法可以使用JPA,或者我必须编写一个困难的自己的@Query并以某种方式迭代,才能通过集合找到一个实体?