Spring boot 我想将POST请求中的数据保存到表中
我正在从POST请求中检索数据并保存到UserSubjects表。我刚保存时还可以,在实体中它是“private Integer subjectId” 用户主题Spring boot 我想将POST请求中的数据保存到表中,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我正在从POST请求中检索数据并保存到UserSubjects表。我刚保存时还可以,在实体中它是“private Integer subjectId” 用户主题 +-----------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+-----
+-----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+----------------+
| id | int(20) | NO | PRI | NULL | auto_increment |
| subjectId | int(11) | YES | MUL | NULL | |
| userId | int(11) | YES | | NULL | |
+-----------+---------+------+-----+---------+----------------+
UserSubjectsEntity.java
@Entity
@Table(name = "userSubjects")
public class UserSubjects {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@OneToOne
@JoinColumn(name="subjectId", referencedColumnName = "id")
private Subjects subjects;
@Column(name = "userId")
private Integer userId;
public UserSubjects(Integer id, Subjects subjects, Integer userId) {
this.id = id;
this.subjects = subjects;
this.userId = userId;
}
public UserSubjects() {
}
// getters and setters..
public interface UserSubjectsRepository extends JpaRepository<UserSubjects, Integer> {
List<UserSubjects> findAllSubjectsByUserId(Integer userId);
}
@Service
public class UserSubjectsService {
@Autowired
UserSubjectsRepository userSubjectsRepository;
// Save subjects in UserSubjects repository
public UserSubjects saveUserSubjects(Integer subjectId, Integer userId, UserSubjects userSubjects) {
userSubjects.setSubjectId(subjectId);
userSubjects.setUserId(userId);
return userSubjectsRepository.save(userSubjects);
}
// Get all subjects that have current user
public List<UserSubjects> getAllSubjects(Integer userId) {
return userSubjectsRepository.findAllSubjectsByUserId(userId);
}
}
@RestController
public class CourseRegistrationController {
@Autowired
UserSubjectsService userSubjectsService;
// Post request for adding subjects to userSubject table
@RequestMapping(value = "courses/registration", method = RequestMethod.POST)
public UserSubjects addUserSubjects(@AuthenticationPrincipal MyUserDetails myUserDetails,
@RequestBody UserSubjects userSubjects) {
return userSubjectsService.saveUserSubjects(userSubjects.getSubjectId(), myUserDetails.getId(), userSubjects);
}
// Get all subjects of user
@RequestMapping(value = "courses/show", method = RequestMethod.GET)
public List<UserSubjects> getAllSubjectsOfUser(@AuthenticationPrincipal MyUserDetails myUserDetails) {
return userSubjectsService.getAllSubjects(myUserDetails.getId());
}
}
@Entity
@Table(name = "subjects")
public class Subjects {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@Column(name = "title", length = 255)
private String title;
@Column(name = "codeSub", length = 255)
private String codeSub;
@ManyToOne
@JoinColumn(name="facultyId", referencedColumnName = "id")
private Faculty faculty;
@ManyToOne
@JoinColumn(name="departmentId", referencedColumnName = "id")
private Departments departments;
@Column(name = "ects")
private String ects;
@Column(name = "lc")
private String lc;
public Subjects(Integer id, String title, String codeSub, Faculty faculty, Departments departments, String ects, String lc) {
this.id = id;
this.title = title;
this.codeSub = codeSub;
this.faculty = faculty;
this.departments = departments;
this.ects = ects;
this.lc = lc;
}
public Subjects() {
}
// gettters and setters..
但是在我想要检索表中的数据之后,我遇到了这个问题。我不仅想得到subjectId,还想得到subjects表中与subjectId对应的所有数据
UserSubjectsRepository.java
@Entity
@Table(name = "userSubjects")
public class UserSubjects {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@OneToOne
@JoinColumn(name="subjectId", referencedColumnName = "id")
private Subjects subjects;
@Column(name = "userId")
private Integer userId;
public UserSubjects(Integer id, Subjects subjects, Integer userId) {
this.id = id;
this.subjects = subjects;
this.userId = userId;
}
public UserSubjects() {
}
// getters and setters..
public interface UserSubjectsRepository extends JpaRepository<UserSubjects, Integer> {
List<UserSubjects> findAllSubjectsByUserId(Integer userId);
}
@Service
public class UserSubjectsService {
@Autowired
UserSubjectsRepository userSubjectsRepository;
// Save subjects in UserSubjects repository
public UserSubjects saveUserSubjects(Integer subjectId, Integer userId, UserSubjects userSubjects) {
userSubjects.setSubjectId(subjectId);
userSubjects.setUserId(userId);
return userSubjectsRepository.save(userSubjects);
}
// Get all subjects that have current user
public List<UserSubjects> getAllSubjects(Integer userId) {
return userSubjectsRepository.findAllSubjectsByUserId(userId);
}
}
@RestController
public class CourseRegistrationController {
@Autowired
UserSubjectsService userSubjectsService;
// Post request for adding subjects to userSubject table
@RequestMapping(value = "courses/registration", method = RequestMethod.POST)
public UserSubjects addUserSubjects(@AuthenticationPrincipal MyUserDetails myUserDetails,
@RequestBody UserSubjects userSubjects) {
return userSubjectsService.saveUserSubjects(userSubjects.getSubjectId(), myUserDetails.getId(), userSubjects);
}
// Get all subjects of user
@RequestMapping(value = "courses/show", method = RequestMethod.GET)
public List<UserSubjects> getAllSubjectsOfUser(@AuthenticationPrincipal MyUserDetails myUserDetails) {
return userSubjectsService.getAllSubjects(myUserDetails.getId());
}
}
@Entity
@Table(name = "subjects")
public class Subjects {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Integer id;
@Column(name = "title", length = 255)
private String title;
@Column(name = "codeSub", length = 255)
private String codeSub;
@ManyToOne
@JoinColumn(name="facultyId", referencedColumnName = "id")
private Faculty faculty;
@ManyToOne
@JoinColumn(name="departmentId", referencedColumnName = "id")
private Departments departments;
@Column(name = "ects")
private String ects;
@Column(name = "lc")
private String lc;
public Subjects(Integer id, String title, String codeSub, Faculty faculty, Departments departments, String ects, String lc) {
this.id = id;
this.title = title;
this.codeSub = codeSub;
this.faculty = faculty;
this.departments = departments;
this.ects = ects;
this.lc = lc;
}
public Subjects() {
}
// gettters and setters..
邮递员的邮寄请求
{
"subjectId":"2"
}
有没有另一种方法可以保存POST请求中的Jpa数据?您应该通过
subjectId
找到Subject
,并将其设置为UserSubjects
,而不是直接从POST正文中设置Integer subjects
要实现这一点,您需要:
公共最终类AddUserSubjectsRequest{
私有整数主语;
公共整数getSubjectId(){
回归主体;
}
public void setSubjectId(整数subjectId){
this.subjectId=主观性;
}
}
AddUserSubjectsRequest
(了解更多信息):@RequestMapping(value=“课程/注册”,method=RequestMethod.POST)
公共用户主题addUserSubjects(
@AuthenticationPrincipal MyUserDetails MyUserDetails,
@RequestBody AddUserSubjectsRequest请求
) {
返回userSubjectsService.saveUserSubjects(request.getSubjectId(),myUserDetails.getId());
}
SubjectsRepository
如果您还没有:公共接口SubjectsRepository扩展了JpaRepository{}
UserSubjectsService
:@服务
公共类UserSubjectsService{
@自动连线
用户主体假设用户主体假设;
@自动连线
主语否定主语否定;
//方法保持完整
}
usersubjects服务。保存usersubjects
方法:public UserSubjects saveUserSubjects(整数subjectId,整数userId){
最终用户主题用户主题=新用户主题();
userSubjects.setSubject(subjectsRepository.getOne(subjectId));
userSubjects.setUserId(userId);
返回userSubjectsRepository.save(userSubjects);
}
注意:从现在起,您应该处理无法找到
主题的情况。当来自POST请求的subjects
表中缺少subjectId
时,可能会发生这种情况。您是否也可以添加subjects
实体类?以及您发送到应用程序的POST请求。我已经添加了主题实体和POST请求。我不清楚如何userSubjects.setSubjectId(subjectId)代码>可以设置吗?UserSubjects
中没有属性Integer subjectId
,只有Subjects Subjects
。是的,我已将此字段更改为Subjects Subjects
,以前它是私有整数subjectId
。然后我必须编写get方法从UserSubjects
表中检索数据,如果我只使用FindAll方法进行检索,它将只检索SujbectId和UserId,而不检索关于这个主题的任何其他信息。所以我知道SubjectId必须有外键,我必须使用JoinColumn来实现它@Maksimiakunin但问题是,我无法将post请求中的数据保存到表中,因为实体中没有私有整数subjectId
,尝试从post请求中保存时,它将返回错误。所以问题是,我是否使用了从POST请求保存数据的错误方法,或者我使用了错误的列。是否有其他获取或保存数据的方法@Maksimiakunii猜你不明白我的意思,我必须使用POST请求方法来获取subjectId
。我正在做的是大学的PMS(个人管理系统)。此时此刻,当学生从可用列表中选择科目时,如果学生选择其中一个科目,我必须检索该科目的id,并使用经过身份验证的用户id将其保存到UserSubject
表中。PS:我有单独的表UserSubjects来保存每个学生的科目列表,即UserSubjects
将包含所有学生的所有科目。如我所见,我正确理解您。你试过我的解决办法吗?要点是您不能仅从POST请求设置原始subjectId
。您应该找到相应的Subject
实体,并将找到的实体设置为UserSubjects
。是的,我已经尝试过了。但问题还是一样,我不能接受POST-request中的subjectID
。哦,那就是你的问题!:)然后我建议您不要直接在控制器中使用UserSubjects实体。只需为此创建一个单独的POJO。我已经相应地更新了我的答案。你能再试一次我的解决方案吗?它很有效,谢谢)但我必须在我的私有主题中添加这些注释@JsonIgnoreProperties({“HibernateLazInitializer”,“handler”})
,因为它给了我错误。