Spring boot 我想将POST请求中的数据保存到表中

Spring boot 我想将POST请求中的数据保存到表中,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我正在从POST请求中检索数据并保存到UserSubjects表。我刚保存时还可以,在实体中它是“private Integer subjectId” 用户主题 +-----------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------+------+-----+-----

我正在从POST请求中检索数据并保存到UserSubjects表。我刚保存时还可以,在实体中它是“private Integer subjectId”

用户主题

+-----------+---------+------+-----+---------+----------------+
| 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

要实现这一点,您需要:

  • 为您的POST请求正文创建一个单独的文本:
  • 公共最终类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”})
    ,因为它给了我错误。