Hibernate:映射单向冗余列

时间:2009-04-01 23:33:10

标签: hibernate mapping denormalized

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

创建一个类型,例如InsertableOnly,在获取集上抛弃数据库值。

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

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

然后制作属性InsertOnlyInteger的Hibernate类型(带有xml或注释,因为它适合你)。

对于sewardrobert给出的答案,这是一个非常相似的答案,但它

  1. 允许你在课堂上设置一个“普通”的设置器,
  2. 协作者/其他/比Hibernate(就像你的Java代码求和例程)可以正常使用,
  3. 可以重复使用,
  4. 有一个不错的名字(比如InsertableOnly),它或多或少都是自我记录的。

答案 2 :(得分:0)

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

您可以使用触发器,也可以完全删除冗余列,并使用物化视图(Oracle& PostgreSQL)/索引视图(SQL Server)/自动摘要表(DB2)来查询报表数据。