我试图填充数据库,在此期间,我在员工和团队之间创建了关联。我正在尝试通过休眠的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;
}
答案 0 :(得分:0)
所以问题是JPA在我创建实体后立即对其进行缓存。
我能够通过致电em.clear()
有关如何使用JpaRepository访问EntityManager的信息,请参见下文:
https://dzone.com/articles/accessing-the-entitymanager-from-spring-data-jpa
请参见下文,了解为什么使用.clear()
EntityManager refresh