Спящий режим: отображение односторонних избыточных столбцов - PullRequest
1 голос
/ 02 апреля 2009

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

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

Разве это лучше всего обрабатывать с помощью триггеров в самой базе данных?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2009

Hibernate позволяет создавать типы и переопределять методы извлечения / сохранения типов.

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

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

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

Затем создайте тип Hibernate для атрибута InsertOnlyInteger (с xml или аннотацией, как вам удобно).

Это очень похожий ответ на ответ, данный sewardrobert, но он

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

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

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

0 голосов
/ 02 апреля 2009

Вы пытались сделать следующее в вашей модели?

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

}

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

НТН

...