Hibernate @OneToMany возвращает ноль при первом вызове - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь заполнить свою базу данных, и во время этого я создаю ассоциации между сотрудниками и командами. Я пытаюсь получить доступ к членам команды в команде через спящий режим ссылки OneToMany и выполняю ленивую загрузку. Это прекрасно работает в моем приложении, кроме случаев, когда я вызываю его сразу после создания сущностей.

Я вполне уверен, что это проблема транзакции или кэширования в спящем режиме, поскольку все строки существуют в базе данных, но Я изо всех сил пытаюсь понять, в чем проблема. Я попытался преобразовать все сохранения в функции populateTeamsAndEmployees в saveAndFlu sh, но это не помогло.

Как заставить team.getTeamMembers () работать каждый раз, когда она вызывается ?

Примечание: это происходит только тогда, когда я вызываю функцию seedData() через RequestMapping, но не происходит, когда я вызываю seedData() с аннотацией @Scheduled


Функция с проблемой

    void seedData() {
       populateTeamsAndEmployees()
       otherBusinessLogic()
    }

    public void otherBusinessLogic() {
       List<Team> teams = teamRepository.findAll();

       teams.foreach(team -> {
            /*
            works great every time, returns all team members
            */
            List<Employee> teamMembers = employeeRepository.findEmployeeByTeamId(team.getId()); 


            /*
            this returns null when ran immediately after populateTeamsAndEmployees(), 
            but returns the same as the line above all other times
            */
            List<Employee> thisDoesntWork = team.getTeamMembers();
       });

    }

    public void populateTeamsAndEmployees() {
        List<EmployeeFromOtherSystem> employeesToConvert = otherSystemRepo.findAll();
        employeesToConvert.foreach(otherSysEmployee -> {
            employeeRepository.save(otherSysEmployee.toEmployee());
        });
    }

Объекты:

class Team {
    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY)
    private List<Employee> teamMembers;
}

class Employee {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

1 Ответ

0 голосов
/ 10 марта 2020

Таким образом, проблема заключалась в том, что JPA кэшировал сущность сразу после того, как я ее создал.

Мне удалось это исправить, вызвав em.clear()

. Ниже описан способ доступа к EntityManager с помощью JpaRepository:
https://dzone.com/articles/accessing-the-entitymanager-from-spring-data-jpa

И см. ниже, для чего использовать .clear()
EntityManager refre sh

...