【问题标题】:How to optimize this OO design in Hibernate ORM?如何在 Hibernate ORM 中优化这种 OO 设计?
【发布时间】: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


【解决方案1】:
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,并将所需的逻辑放入其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多