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