Reputation: 155
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
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:
public final class AddUserSubjectsRequest {
private Integer subjectId;
public Integer getSubjectId() {
return subjectId;
}
public void setSubjectId(Integer subjectId) {
this.subjectId = subjectId;
}
}
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());
}
SubjectsRepository
if you don't have it yet:public interface SubjectsRepository extends JpaRepository<Subjects, Integer> { }
UserSubjectsService
:@Service
public class UserSubjectsService {
@Autowired
UserSubjectsRepository userSubjectsRepository;
@Autowired
SubjectsRepository subjectsRepository;
// methods left intact
}
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