JPA实体延迟加载功能会导致不可重复读取现象吗?它会导致给定实体和延迟加载的相关实体(例如@OneToMany)之间的不一致吗?
让我用一个(相当复杂的)例子来说明这些问题。取两个 JPA 实体,Department (1) <--> (N) Employee。我们要计算公司的工资总额:
@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 或将员工锁定在 Optimistic Read 模式来解决,但我想知道延迟加载(如果有的话)可能出现的潜在一致性问题。我在互联网上搜索并没有找到任何参考。