Как оптимизировать дизайн ОО в 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, и поместить в него нужную логику.