基于面向对象的方法,我编写了以下实体:
@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)不允许域对象中的事务。
答案 0 :(得分: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,并将所需的逻辑放入其中。