在我的架构中,有一些冗余列用于加速报表查询。例如,销售的购买总额保存在"purchase_total"
表的"sale"
列中,但在模型中,它是通过将销售中每件商品的售价加起来动态计算的。可以通过调用Sale对象上的“getPurchaseTotal”访问器来检索此值。
有没有办法在插入/更新时将此值映射到sale表中的purchase_total列,但是从数据库加载时没有将它包含在Sale对象的水合作用中?我猜它类似于派生或计算的列,但相反。
最好通过数据库本身的触发器来处理这个问题吗?
答案 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给出的答案,这是一个非常相似的答案,但它
答案 2 :(得分:0)
我可能会在数据库中执行此操作,因为这些列与您的主应用程序无关。
您可以使用触发器,也可以完全删除冗余列,并使用物化视图(Oracle& PostgreSQL)/索引视图(SQL Server)/自动摘要表(DB2)来查询报表数据。