JPA实体延迟加载功能是否会导致不可重复的读取现象?是否会导致给定实体与延迟加载的相关实体(例如@OneToMany)之间的不一致?
让我用一个(相当卷积的)例子说明问题。拿两个JPA实体, 部门(1)< - > (N)员工。我们想要计算公司的工资总额:
@Stateless
public class EmployeeManagerImpl implements EmployeeManager {
public long calculateDepartmentTotals() {
long total = 0;
for (Department dept : findAllDepartments()) { // SELECT all departments
for (Employee emp : dept.getEmployees()) { // Lazy-loading of employees
total += emp.getSalary();
}
}
return total;
}
}
首先,我们从数据库中选择所有部门(在t0)。然后,我们迭代这个集合,并在t1,t2,t3 ...... tn时间点懒洋洋地为每个部门getEmployees()。现在,如果某个其他事务在t0和tn之间将员工从一个部门移动到另一个部门,那么员工薪水可以总计两次(或者没有)。所以我猜工资总额可能会被错误地计算出来。
另外,如果我们在网页中显示每个部门的员工列表,那么我们也会将该员工列出两次(或者没有)。
我的猜测是否正确?
PS:当然,上述问题可以通过使用LEFT JOIN FETCH或在乐观读取模式下锁定员工来解决,但我想知道延迟加载(如果有的话)可能出现的潜在一致性问题。我在互联网上搜索并没有找到任何参考。