2013-06-27 2 views
1

на основе объектно-ориентированного подхода, я пишу следующие объекты:Как оптимизировать этот дизайн OO в 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

Когда-либо вычисленное поле, как показано в ответах на [этот вопрос] (http://stackoverflow.com/questions/2986318/calculated-property-with-jpa-hibernate)? –

+0

[Здесь] (http://www.jroller.com/eyallupu/entry/hibernate_derived_properties_performance_and) ваш ответ. –

+0

Благодарим вас за ответ. Раньше я никогда не слышал о @Formula, но это решит мою проблему. –

ответ

0
In the first case, select * from orders. 

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

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

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

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

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

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

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

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