2

JPAエンティティの遅延読み込み機能により、繰り返し不可能な読み取り現象が発生する可能性がありますか? 特定のエンティティと、遅延ロードされた関連エンティティ (@OneToMany など) との間に矛盾が生じる可能性はありますか?

(かなり複雑な)例を使用して質問を説明しましょう。Department (1) <--> (N) Employee という 2 つの JPA エンティティーを取り上げます。会社の給与合計を計算します。

@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 の間に他のトランザクションによって従業員がある部門から別の部門に移動した場合、従業員の給与は 2 回合計される (またはまったく合計されない) 可能性があります。したがって、給与総額が誤って計算される可能性があると思います。

また、Web ページに部門ごとの従業員のリストを表示すると、その従業員も 2 回 (または 1 つも) リストされません。

私の推測は正しいですか?

PS: もちろん、上記の問題は LEFT JOIN FETCH を使用するか、Optimistic Read モードで従業員をロックすることで解決できますが、遅延読み込みで発生する可能性のある潜在的な一貫性の問題について知りたいです (もしあれば)。インターネットで検索しましたが、参考文献が見つかりませんでした。

4

0 に答える 0