1

基于面向对象的方法,我编写了以下实体:

@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()a 的方法时Customer,Hibernate 会发出一个SELECT * FROM Order查询来检索所有Orders. Order随着岁月的流逝,数量肯定会增加。我相信aSELECT SUM(o.total) FROM Order o会给出更好的表现,CMIIMW。我只是不知道我应该把查询放在哪里?面向对象设计的规则建议它getTotal()应该是 的一部分Customer,但我使用的框架(Spring Transaction)不允许域对象中的事务。

4

1 回答 1

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,并将所需的逻辑放入其中。

于 2017-09-28T11:43:23.643 回答