2013-02-28 2 views
0

DB에 간단한 일대 다 관계가 있습니다. 여기에 해당하는 클래스는 다음과 같습니다 count 업데이트 유지하기 위해최대 절전 모드를 사용하여 테이블의 '많은'항목 수를 업데이트합니다.

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; 
} 

, 나는 각 CUD 작업에 count을 설정하고있다. Department에 직원을 추가/삭제할 때마다 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 –

+0

각 부서 액세스에 모든 직원 행을로드하지 않으려는 것입니다. FetchType은 LAZY입니다. 그러나 각 Dept에서 읽은 요약 (직원 수)을 표시해야합니다. –

+0

그런 다음 "Extra Lazy"페칭 시작일 (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#performance-fetch)을 살펴보아야합니다. 주석을 사용하는 경우 @LazyCollection (LazyCollectionOption.EXTRA) – overmeulen

0

내가 아는 한 최대 절전 모드에서는 자동으로 작동하지 않습니다.

어쨌든 일반적으로 이는 잘못된 결과를 초래할 수 있습니다. 한 사용자가 직원을 추가하고 동시에 두 번째 사용자가 다른 직원을 제거하면 어떻게됩니까? (이 경우는 여전히 Hibernate에서 처리 될 수있다.) 또는 dba가 insert 문으로 직원을 추가하거나 백업에서 데이터를로드하면 어떻게 될까?

데이터베이스 모델 측면에서 이것은 불필요한 정보이므로 생략해야합니다. 대신 SELECT COUNT(*) FROM employee WHERE dept =:deptId을 사용해야합니다.

카운트 열에 대한 유일한 이유는 카운트가 자주 필요하고 select (*)에 성능 문제가있는 경우입니다. 이 특별한 경우에는 Hibernate 자동 연산이 없다.

편집 :

지금 막 오버 쿨렌스의 답변을 보았습니다. 그것도 효과가 있습니다. 카운트 만 필요하다면, SELECT COUNT(*) (HQL에서도 수행 가능)이 빨라집니다. 어쨌든 직원 레코드가 필요하다면 Overmeulens 솔루션의 성능이 더 좋습니다.

+0

을 추가해야합니다. 카운트 필드의 신성함을 유지하기 어렵다는 것을 알고 있습니다. 그러나 각 get에서 선택 횟수 (*)를 피하고 싶습니다. [쓰기는 항상 Hibernate를 사용할 것이고 DBA의 외부 작업은 허용되지 않을 것입니다.] –

+1

나는 단지 자동화가없는 이유를 설명하고 싶었습니다. 솔루션을 계속 사용하거나 수동으로 계산할 수 있습니다 (또는 직원을 추가 또는 제거 할 때마다 'SELECT COUNT (*)'실행 - 어쨌든 자주 발생하지 않음). 업데이트 할 부서를 선택하거나 직원 테이블이 추가되거나 제거 될 때마다 증가하는 부서 테이블 (어쨌든 가져야 함). – Johanna

관련 문제