I want to save data from POST request to table

I'm retrieving data from POST request and saving to UserSubjects table. It was okay while i was just saving and in entity it was "private Integer subjectId".

UserSubjects

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

But after i want to retrieve the data that i have in that table, i faced with the problem. I want to get not only subjectId, but all data that corresponds to subjectId in subjects table.

UserSubjectsRepository.java

public interface UserSubjectsRepository extends JpaRepository<UserSubjects, Integer> {
    List<UserSubjects> findAllSubjectsByUserId(Integer userId);
}

UserSubjectsService.java

@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);
    }
}

CourseRegistrationController.java

@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());
    }
}

SubjectsEntity.java

@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..

POST request from Postman

{
    "subjectId":"2"
}

Is there another way to save in Jpa data from POST request?

Upvotes: 0

Views: 2397

Answers (1)

Maksim Yakunin
Maksim Yakunin

Reputation: 458

Instead of setting Integer subjectId from POST body directly you should find Subject by subjectId and set it to UserSubjects.

To achieve this you need:

  1. Create a separate POJO for you POST-request body:
public final class AddUserSubjectsRequest {
    private Integer subjectId;

    public Integer getSubjectId() {
        return subjectId;
    }

    public void setSubjectId(Integer subjectId) {
        this.subjectId = subjectId;
    }
}
  1. Use newly created AddUserSubjectsRequest in your controller (read more about that here):
@RequestMapping(value = "courses/registration", method = RequestMethod.POST)
public UserSubjects addUserSubjects(
    @AuthenticationPrincipal MyUserDetails myUserDetails,
    @RequestBody AddUserSubjectsRequest request
) {
    return userSubjectsService.saveUserSubjects(request.getSubjectId(), myUserDetails.getId());
}
  1. Create SubjectsRepository if you don't have it yet:
public interface SubjectsRepository extends JpaRepository<Subjects, Integer> { }
  1. Inject it to UserSubjectsService:
@Service
public class UserSubjectsService {
    @Autowired
    UserSubjectsRepository userSubjectsRepository;

    @Autowired
    SubjectsRepository subjectsRepository;

    // methods left intact
}
  1. Modify UserSubjectsService.saveUserSubjects method:
public UserSubjects saveUserSubjects(Integer subjectId, Integer userId) {
    final UserSubjects userSubjects = new UserSubjects();
    userSubjects.setSubject(subjectsRepository.getOne(subjectId));
    userSubjects.setUserId(userId);
    return userSubjectsRepository.save(userSubjects);
}

Note: from now you should handle the case when Subject can be not found. It may happen when subjectId from POST-request is missing from subjects table.

Upvotes: 1

Related Questions