【发布时间】:2020-01-26 01:08:38
【问题描述】:
我有一个使用 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);
}
还有 Classroom 存储库:
public interface ClassroomRepository extends CrudRepository<Classroom , Integer>{
}
我有一个 SpringApplication 主文件,但没有控制器。
CLASSROOM 表中已有一间教室,房间 id=1。当我向http://localhost:8080/students 发出以下POST 请求时,在Student 表中创建了一个新的学生记录,我预计它会失败,因为CLASSROOM 中不存在id=100 的教室。
所以我的问题是:Spring Data JPA 可以强制执行 manyToOne 关系还是必须在数据库端执行此外键强制(Student 表中的非空 ROOM_ID 列未定义为外键 由我们的 DBA 出于合法考虑)。如果必须在数据库端完成,那么在实体文件中定义 manyToOne 关系有什么意义?
另外,我知道我在 Student 实体中有多余的教室字段,我只是不知道在 Student 实体中保留哪一个(roomId 或“教室”字段),因为当我创建一个学生时,我只想在请求中提供教室的 roomId。谢谢!
{
"roomId": 100 // I expect this request to fail because no roomId=100 in the CLASSROOM table.
}
【问题讨论】:
标签: spring-boot spring-data-jpa spring-data spring-data-rest