2013-02-28 26 views
0

我在數據庫中有一個簡單的一對多關係。這裏有相應的職業:使用Hibernate更新表中'多個'項目的計數

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更新,我在每個CUD操作設定count。有沒有一種自動方式可以將員工每次添加/刪除時更新count? (註釋/限制什麼的?)

回答

1

爲什麼在員工數量上保持一個全局變量? 添加一個返回僱員列表大小的方法更安全,更優雅。

public class Department { 

    private int deptId; 
    private List<Employee> employees; 

    public int getCount() { 
     if (employees == null) { 
     return 0; 
     } 
     return employees.size(); 
    } 
} 
+0

不錯的答案。你爲什麼只冷靜在stackoverflow上? :P – 2013-02-28 10:20:10

+0

這只是我不想加載每個部門訪問中的所有員工行。 FetchType是LAZY。但是,我需要顯示每個部門閱讀的摘要(員工人數)。 – 2013-02-28 10:34:50

+0

然後,您應該看看「Extra Lazy」提取startegy:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#performance-fetching。如果你使用註釋,你只需要添加@LazyCollection(LazyCollectionOption.EXTRA) – overmeulen 2013-03-01 08:35:25

0

據我所知在Hibernate中沒有自動方式。

無論如何,通常這會產生錯誤的結果。如果一個用戶添加一個員工,同時第二個用戶刪除另一個員工,會發生什麼? (這種情況仍然可以在Hibernate中處理。)或者,如果dba通過insert語句添加一些員工或從備份中加載數據會發生什麼情況?

在數據庫模型的視圖中,這是多餘的信息,應該省略。應該使用SELECT COUNT(*) FROM employee WHERE dept =:deptId

計數列的唯一原因是,如果您經常需要計數,並且您在選擇(*)時遇到性能問題。對於這種特殊情況,不存在Hibernate自動機制。

編輯:

我剛看到現在Overmeulens回答。這也是工作。如果您只需要計數,那麼SELECT COUNT(*)(也可以在HQL中完成)更快,如果您需要員工記錄,那麼Overmeulens解決方案具有更好的性能。

+0

我知道這將是很難保持計數字段的神聖性。但是,我想避免每個get的選擇計數(*)。 [寫入總是使用休眠和DBA的外部動作將不被允許。] – 2013-02-28 10:37:37

+1

我只是想解釋爲什麼可能沒有自動化。您可以繼續使用您的解決方案,手動計數(或在每次添加或刪除員工後執行「SELECT COUNT(*)」) - 並且不會經常發生),並選擇要更新的部門或在部門表(無論如何你都應該擁有它),無論何時添加或刪除員工,這個表都會增加。 – Johanna 2013-02-28 10:43:44