2009-04-01 6 views
1

내 스키마에는 보고서 쿼리 속도를 높이기 위해 몇 가지 중복 열이 있습니다. 예를 들어, 판매의 구매 합계는 "sale" 테이블의 "purchase_total" 열에 저장되지만 모델에서는 판매 된 각 품목 구매의 판매 가격을 합산하여 동적으로 계산됩니다. 이 값은 Sale 오브젝트에서 "getPurchaseTotal"액세서를 호출하여 검색 할 수 있습니다.최대 절전 모드 : 단방향 중복 열 매핑

삽입/업데이트 할 때 판매 테이블의 purchase_total 열에이 값을 매핑 할 수 있지만 데이터베이스에서로드 할 때 판매 개체의 수화에 포함시키지 않았습니까? 파생되거나 계산 된 열과 비슷하지만 그 반대입니다.

데이터베이스 자체에서 트리거를 통해 처리하는 것이 가장 좋습니까?

답변

0

모델에서 다음을 시도해 보셨습니까?

public class Sales { 

    /** 
    * this set method ignores the value loaded from the database. 
    */ 
    public void setPurchaseTotal(double val) { 
    // ignore a value set explicitly by hibernate 
    } 

    /** 
    * Compute the purchase total 
    */ 
    public double getPurchaseTotal() { 
    // sum item totals 
    double sum = 10.0; 

    return sum; 
    } 

} 

이렇게하면로드 된 데이터는 무시되지만 데이터베이스에 저장하면 값이 유지됩니다.

HTH

+0

나는 그것을 생각했지만 오히려 내가 해킹을 고려해야 할 것에 의지하지 않을 것이다. 분명히 그러한 중복 열이보고 목적으로 존재하는 것이 일반적입니까? –

0

Hibernate는 유형의 metods을 저장/당신이 가져 오는을 유형을 작성하고 대체 할 수 있습니다.

가져 오기 세트에서 데이터베이스 값을 버리는 유형 (예 : InsertableOnly)을 만듭니다. (당신을 맞는 등, XML 또는 주석)

class InsertOnlyInteger extends org.hibernate.type.IntegerType { 
    public Object get(ResultSet rs, String name) throws SQLException { 
    return null; 
    } 
} 

그런 다음 속성 InsertOnlyInteger의 Hibernate 타입을 : 당신은 반올림 문제를 방지하기 위해 센트의 가격을 나타 내기 때문에

은 값을 가정하는 정수입니다. 같은 어떤

  • 협력자/기타/최대 절전 모드에 비해 (

    이것은 sewardrobert에 의해 주어진 대답 매우 비슷한 대답이지만,

    1. 당신이 클래스의 "정상적인"세터를 가질 수 있습니다 귀하의 Java 코드 합계 루틴) 일반적으로 사용하실 수 있습니다
    2. 다시 사용할 수 있으며
    3. 괜찮은 이름 (예 : InsertableOnly) 그것은 다소 문서화 자체.
  • +0

    약간 낫지 만 세일즈 클래스에 세터가 필요합니까? 나는 setter를 필요로하지 않는다. (명백한 이유로) ORM을 위해 하나를 추가하는 것은 여전히 ​​해킹으로 간주된다. –

    0

    주 응용 프로그램과 관련이 없기 때문에 아마도 데이터베이스에서이 작업을 수행 할 것입니다.

    트리거를 사용하거나 중복 열을 완전히 제거하고 보고서 데이터를 쿼리하기위한 구체화 된보기 (Oracle & PostgreSQL)/인덱싱 된 뷰 (SQL Server)/자동 요약 테이블 (DB2)을 사용할 수 있습니다.