2009-04-01 4 views
1

В моей схеме есть несколько избыточных столбцов, используемых для ускорения запросов к отчетам. Например, общая сумма покупки сохраняется в столбце "purchase_total" таблицы "sale", но в модели она рассчитывается динамически путем суммирования проданной цены каждой покупки товара в продаже. Это значение можно получить, вызвав аксессуар getPurchaseTotal на объекте Sale.Спящий режим: сопоставление односторонних резервных столбцов

Есть ли способ сопоставить это значение с столбцом purchase_total в таблице продаж при вставке/обновлении, но НЕ включать ли он в увлажнение объекта Sale при загрузке из базы данных? Я думаю, это похоже на производный или расчетный столбец, но наоборот.

Лучше всего это обрабатывать через триггеры в самой базе данных?

ответ

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; 
    } 

} 

Это игнорирует данные, которые будут загружены, но сохранит значение при сохранении в базе данных.

НТН

+0

Я действительно думал об этом, но предпочел бы не прибегать к тому, что я считаю взломом. Разумеется, для таких избыточных столбцов достаточно общего для целей отчетности? –

0

Hibernate позволяет создавать типы и переопределить выборку/сохранение metods из типов.

Создайте тип, например, InsertableOnly, который на наборах извлечения выбрасывает значение базы данных.

Если предположить, что значение является Integer, потому что вы представляете цены в центах, чтобы избежать округления вопросы:

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

Затем сделайте тип гибернации атрибута InsertOnlyInteger (с XML или аннотацию, так как он вам подходит).

Это очень похож ответ на ответ дается sewardrobert, но

  1. позволяет иметь «нормальный» сеттер в классе, который
  2. соавторов/другие /, чем Hibernate (например, ваша программа суммирования Java-кода), то можно использовать нормально,
  3. его можно использовать повторно, и
  4. с достойным именем (например, InsertableOnly) это более или менее самодокументирующее.
+0

Это немного лучше, но по-прежнему потребуется сеттер на классе Sale, не так ли? У меня нет необходимости в сеттерах (по понятным причинам), поэтому добавление одного для ORM по-прежнему считается взломом. –

0

Я бы, вероятно, сделал это в базе данных, поскольку эти столбцы не имеют отношения к вашему основному приложению.

Вы можете использовать триггеры или полностью избавиться от избыточных столбцов и использовать материализованное представление (Oracle PostgreSQL)/индексированное представление (SQL Server)/сводную таблицу (DB2) для запроса данных вашего отчета.

Смежные вопросы