1

在我的架构中,有一些冗余列用于加速报表查询。例如,销售的采购总额保存在表格的"purchase_total"列中"sale",但在模型中,它是通过将销售中每个购买的商品的售价相加来动态计算的。可以通过在 Sale 对象上调用“getPurchaseTotal”访问器来检索此值。

有没有办法在插入/更新时将此值映射到销售表中的 purchase_total 列,但在从数据库加载时不包含在销售对象的水合中?我猜它类似于派生或计算的列,但相反。

最好通过数据库本身的触发器来处理这个问题吗?

4

3 回答 3

0

我可能会在数据库中执行此操作,因为这些列与您的主应用程序无关。

您可以使用触发器,或者完全摆脱冗余列并使用物化视图(Oracle 和 PostgreSQL)/索引视图(SQL Server)/自动汇总表(DB2)来查询您的报告数据。

于 2009-05-26T07:30:23.853 回答
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;
  }

}

这将忽略加载的数据,但在保存到数据库时会保留该值。

高温高压

于 2009-04-02T00:25:03.480 回答
0

Hibernate 允许您创建类型并覆盖类型的获取/保存方法。

创建一个类型,例如 ,InsertableOnly它在 fetch 集上丢弃数据库值。

假设您的价值是整数,因为您以美分表示价格以避免四舍五入问题:

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

然后使属性 InsertOnlyInteger 的 Hibernate 类型(使用 xml 或注释,因为它适合您)。

这与 sewardrobert 给出的答案非常相似,但它

  1. 允许你在类中有一个“正常”的设置器,它
  2. 合作者 /other/ 比 Hibernate (如你的 Java 代码求和例程)可以正常使用,
  3. 它是可重复使用的,并且
  4. 有一个像样的名字(比如 InsertableOnly),它或多或少是自我记录的。
于 2009-04-02T01:07:47.557 回答