Как оптимизировать дизайн ОО в Hibernate ORM?

Основываясь на объектно-ориентированном подходе, я пишу следующие объекты:

@Entity
public class Customer {

  @Id
  private String id;

  @OneToMany
  private List<Order> orders;

  public BigDecimal getTotal() {
     // iterate over orders and sum the total
     BigDecimal total = BigDecimal.ZERO;
     for (Order o: orders) {
        total = total.add(o.getTotal());
     }
     return total;
  }

  ... // getter & setter

}

@Entity
public class Order {

  @Id
  private String id;

  private BigDecimal total;

  ...

}

Я понял, что при звонке getTotal() метод для Customer, Hibernate выдаст SELECT * FROM Order запрос, чтобы получить все Orders, Номер Order несомненно возрастет с годами. Я верю SELECT SUM(o.total) FROM Order o даст лучшую производительность, CMIIMW. Я просто не знаю, куда мне поставить запрос? Правила объектно-ориентированного проектирования предполагают, что getTotal() должен быть частью Customer, но используемая мной среда (Spring Transaction) не допускает транзакции в доменных объектах.

1 ответ

In the first case, select * from orders.

Вы только получаете список заказов, и вам нужно вычислить сумму в коде на стороне сервера с итерацией по заказам.

In the second case, select sum(o.total) from orders where order.customer_ id = 1234;

База данных делает расчет за вас. С точки зрения производительности, это лучше.

Почему база данных должна делегировать какой-то верхний уровень, когда она может это сделать.

Поэтому я предлагаю вам только второй случай.

Согласно ОО, он может предложить инкапсулировать как свойства, так и связанные методы.

But its a Domain Class, which gets directly mapped to fields in Database.

Чтобы отделить логику доступа к данным, у нас может быть отдельный уровень, то есть DAO, и поместить в него нужную логику.

Другие вопросы по тегам