1

私のスキーマには、レポート クエリを高速化するために使用される冗長な列がいくつかあります。たとえば、セールの購入合計はテーブルの"purchase_total"列に保存されますが"sale"、モデルでは、セールで購入された各アイテムの販売価格を合計することで動的に計算されます。この値は、Sale オブジェクトで「getPurchaseTotal」アクセサーを呼び出すことによって取得できます。

挿入/更新時にこの値を sales テーブルの purchase_total 列にマップする方法はありますが、データベースからロードするときに Sale オブジェクトのハイドレーションには含まれませんか? 派生列または計算列に似ていると思いますが、逆です。

データベース自体のトリガーを介してこれを処理するのが最善ですか?

4

3 に答える 3

0

Hibernateを使用すると、タイプを作成し、タイプのフェッチ/保存メトッドをオーバーライドできます。

タイプを作成します。たとえば、InsertableOnlyフェッチセットでデータベース値を破棄します。

四捨五入の問題を回避するために価格をセントで表すため、値が整数であると想定します。

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

次に、属性InsertOnlyIntegerのHibernateタイプを作成します(必要に応じて、xmlまたはアノテーションを使用)。

これはスワードロバートの答えと非常によく似ていますが、

  1. クラスに「通常の」セッターを含めることができます。
  2. Hibernate以外のコラボレーター/other/(Javaコード加算ルーチンなど)は、通常どおりに使用できます。
  3. 再利用可能で、
  4. 適切な名前(InsertableOnlyなど)を使用すると、多かれ少なかれ自己文書化されます。
于 2009-04-02T01:07:47.557 に答える
0

これらの列はメインアプリケーションに関連しないため、おそらくデータベースで実行します。

トリガーを使用するか、冗長な列を完全に取り除き、マテリアライズド・ビュー(OracleおよびPostgreSQL)/索引付きビュー(SQL Server)/自動要約表(DB2)を使用してレポート・データを照会することができます。

于 2009-05-26T07:30:23.853 に答える