[英]How to retrieve id of persisted object in Service layer in the same method where is persisted with Hibernate + JPA in Spring Boot?
I have a Learner object that sign-up to one or multiple Courses.我有一个学习者 object 注册了一个或多个课程。 Learner table has a relation one-to-many with LearnerSubmittedToCourse.
学习者表与 LearnerSubmittedToCourse 具有一对多的关系。 In my repository, I save the Learner object in PostgreSql, but after, when I try to find the id of Lerner as to send in LearnerSubmittedToCourse table, I cannot access it (or it is not already perssited).
在我的存储库中,我将 Learner object 保存在 PostgreSql 中,但是之后,当我尝试在 LearnerSubmittedToCourse 表中查找 Lerner 的 id 时,我无法访问它(或者它尚未持久化)。
learner1 object should contain the current learner id but it dosent. learner1 object 应该包含当前的学习者 ID,但它不包含。
OBS. OBS。 The Learner id is auto-generated in db.!
学习者 ID 是在 db 中自动生成的! Learner obj doesent contain the id.
学习者 obj 不包含 id。
My Service:我的服务:
@Override
public LearnerDto createLearner(LearnerDto learnerDto) {
Optional<Domain> domain = domainRepository.findById(learnerDto.getDomain().getId());
Optional<WorkExperience> workExperience = workExperienceRepository.findById(learnerDto.getDomain().getId());
domain.ifPresent(d -> {
workExperience.ifPresent(w -> {
Learner learner = new Learner()
.setFirstName(learnerDto.getFirstName())
.setLastName(learnerDto.getLastName())
.setMobileNo(learnerDto.getMobileNo())
.setEmail(learnerDto.getEmail())
.setLastJob(learnerDto.getLastJob())
.setJob(learnerDto.getJob())
.setLearnerDateCreated(learnerDto.getLearnerDateCreated())
.setLearnerDetails(learnerDto.getLearnerDetails())
.setWhereYouFindUs(learnerDto.getWhereYouFindUs())
.setIsCareer(learnerDto.getIsCareer())
.setIsBusiness(learnerDto.getIsBusiness())
.setObservation(learnerDto.getObservation())
.setIsGDPRAccepted(learnerDto.getIsGDPRAccepted())
.setScheduledCoursesList(foundScheduledCoursesList)
.setDomain(d)
.setWorkExperience(w);
learnerRepository.save(learner);
Learner learner1 = learnerRepository.findById(learnerDto.getId());
for (ScheduledCourses course : learnerDto.getScheduledCoursesList()
) {
Optional<ScheduledCourses> foundCourse = scheduledCoursesRepository.findById(course.getId());
foundCourse.ifPresent(c -> {
learnerSubmittedToCourseService.registerLearnerToScheduledCourse(learner1, course);
});
}
});
});
return learnerDto;
}
public void registerLearnerToScheduledCourse(Learner learner, ScheduledCourses scheduledCourses) {
Optional<Learner> foundLearner = learnerRepository.findById(learner.getId());
Optional<ScheduledCourses> foundScheduledCourse = scheduledCoursesRepository.findById(scheduledCourses.getId());
foundLearner.ifPresent(l -> {
foundScheduledCourse.ifPresent(c -> {
LearnerSubmittedToCourse learnerSubmittedToCourse = new LearnerSubmittedToCourse()
.setLearner(l)
.setScheduledCourses(c);
learnersSubmittedToCourseRepository.save(learnerSubmittedToCourse);
});
});
How can I get my Learner id as to use it in LearnerSubmittedToCourse object?如何获取我的学习者 ID 以便在 LearnerSubmittedToCourse object 中使用它?
learnerRepository.save(learner);
is returning the instance you are looking for.正在返回您正在寻找的实例。
learner = learnerRepository.save(learner);
Now the id should be set correctly on learner
.现在应该在
learner
上正确设置 id 。
Be aware that in the service code you posted as part of your question, you create and save a new Learner
from the info in the DTO.请注意,在您作为问题的一部分发布的服务代码中,您可以根据 DTO 中的信息创建并保存一个新的
Learner
。 However, the ID which is generated during the save
is set on the entity and not on the DTO, so the following call cannot work:但是,
save
期间生成的 ID 是在实体上设置的,而不是在 DTO 上设置的,因此以下调用无法工作:
Learner learner1 = learnerRepository.findById(
learnerDto.getId() // <-- the DTO does not know about the generated ID
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.