0

私のDBには単純な1対多の関係があります。対応するクラスは次のとおりです。

class Department
{
    int deptId;
    int count; //This corresponds to the total number of Employees in a department
    List<Employee> employees; //An employee belongs to only one department
}

class Employee
{
    int employeeId;
    Department dept;
}

count最新の状態を維持するためにcount、各CUD操作に を設定しています。count従業員を部門に追加/削除するたびに自動的に更新する方法はありますか? (注釈/制限か何か?)

4

2 に答える 2

1

なぜ従業員数でグローバル変数を保持するのですか? 従業員リストのサイズを返すメソッドを追加すると、より安全で洗練されたものになります。

public class Department {

   private int deptId;
   private List<Employee> employees;

   public int getCount() {
      if (employees == null) {
         return 0;
      }
      return employees.size();
   }
}
于 2013-02-28T10:15:06.223 に答える
0

私の知る限り、Hibernate には自動的な方法はありません。

とにかく、一般的に、これは間違った結果を生み出すリスクがあります。あるユーザーが従業員を追加し、同時に別のユーザーが別の従業員を削除するとどうなりますか? (このケースはまだ Hibernate で処理できます。) あるいは、データベース管理者が INSERT ステートメントによって従業員を追加したり、バックアップからデータをロードしたりするとどうなりますか?

データベース モデルの観点からは、これは余分な情報であり、省略する必要があります。代わりに aSELECT COUNT(*) FROM employee WHERE dept =:deptIdを使用する必要があります。

カウント列の唯一の理由は、カウントが非常に頻繁に必要であり、select(*) でパフォーマンスの問題がある場合です。この特殊なケースでは、Hibernate の自動化はありません。

編集:

Overmeulens の回答を見たところです。それも機能しています。カウントのみが必要な場合はSELECT COUNT(*)(HQLでも実行できます)の方が高速です。とにかく従業員レコードが必要な場合は、Overmeulensソリューションのパフォーマンスが向上します。

于 2013-02-28T10:31:46.087 に答える