Hibernate @OneToMany在第一次调用时返回null

时间:2020-03-09 18:31:50

标签: spring hibernate jpa spring-data-jpa

我试图填充数据库,在此期间,我在员工和团队之间创建了关联。我正在尝试通过休眠的OneToMany参考访问团队中的团队成员并进行延迟加载。这在我的应用程序中效果很好,除非在实体创建后立即调用它。

我很确定这是一个休眠事务或缓存问题,因为所有行都存在于数据库中,但是我一直在努力了解问题所在。我尝试将populateTeamsAndEmployees函数中的所有保存都转换为saveAndFlush,但这没有帮助。

如何使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 :(得分:0)

所以问题是JPA在我创建实体后立即对其进行缓存。

我能够通过致电em.clear()

来修复它

有关如何使用JpaRepository访问EntityManager的信息,请参见下文:
https://dzone.com/articles/accessing-the-entitymanager-from-spring-data-jpa

请参见下文,了解为什么使用.clear()
EntityManager refresh

相关问题