2009-04-01 8 views
1

私のスキーマには、レポートクエリを高速化するためにいくつかの冗長カラムがあります。たとえば、売り上げの購入合計は"sale"テーブルの"purchase_total"列に保存されますが、モデルでは、売り上げ内の各商品購入の売り上げ価格を合計して動的に計算されます。この値は、SaleオブジェクトのgetPurchaseTotalアクセサを呼び出すことで取得できます。Hibernate:一方向の冗長カラムのマッピング

挿入/更新時にこの値を販売表の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または注釈付き)属性InsertOnlyIntegerのHibernateの型を作る次に

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

:あなたは丸めの問題を回避するために、セントで価格を記載しているので、あなたの値を仮定し

は整数です。以下のようなその

  • 協力者/その他/休止状態よりも(

    これはsewardrobertによって与えられた答えに非常によく似答えですが、それ

    1. あなたはクラスで「通常」のセッターを持つことができますあなたのJavaコードの集計ルーチン)は通常、
    2. 再利用可能であり、適切な名前(InsertableOnlyのような)を持つ
    3. を通常使うことができます。それは多かれ少なかれ自己文書化です。
  • +0

    これはやや良いですが、セールクラスでセッターが必要ですか?私はセッター(明白な理由のため)の必要がないので、ORMのために1つを追加することはまだハックとみなされます。 –

    0

    これらの列はメインアプリケーションとは関係がないため、おそらくデータベースでやります。

    トリガーを使用するか、冗長列を完全に取り除いて、レポート・データを照会するためのマテリアライズド・ビュー(Oracle & PostgreSQL)/索引付きビュー(SQL Server)/自動サマリー・テーブル(DB2)を使用できます。

    関連する問題