如何在Hibernate ORM中优化这个OO设计?

时间:2013-06-27 07:44:48

标签: java hibernate oop orm ooad

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

@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 个答案:

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