我有一个使用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.
}
在实体文件中定义多通关系的意义是什么
因为是一个对象关系映射工具,允许您定义实体图。
您当前正在传递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并以某种方式迭代,才能通过集合找到一个实体?