简体   繁体   English

如何在服务层中以与 Hibernate + JPA 持久化的方法相同的方法检索服务层中持久化 object 的 ID?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM