【发布时间】:2013-06-24 14:52:36
【问题描述】:
基于面向对象的方法,我编写了以下实体:
@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;
...
}
我意识到当为Customer 调用getTotal() 方法时,Hibernate 将发出SELECT * FROM Order 查询以检索所有Orders。随着岁月的流逝,Order 的数量肯定会增加。我相信SELECT SUM(o.total) FROM Order o 会提供更好的性能,CMIIMW。我只是不知道我应该把查询放在哪里?面向对象设计规则建议getTotal() 应该是Customer 的一部分,但我使用的框架(Spring Transaction)不允许域对象中的事务。
【问题讨论】:
-
曾经在计算字段上,如this question的答案所示?
-
Here's你的答案。
-
感谢您的回答。我以前从未听说过@Formula,但它会解决我的问题。
标签: java hibernate oop orm ooad