代码之家  ›  专栏  ›  技术社区  ›  remi bourgarel

如何用类组合加载数据?

  •  0
  • remi bourgarel  · 技术社区  · 14 年前

    以下是我的课程:

    class PriceScale
    -int ID
    -float bookingFees
    -Product product
    -List<PricePeriod> periods
    
    Class Product
    -int ID
    -string name
    -List<PriceScale> priceScales
    
    class PricePeriod
    -DateTime begin
    -DateTime end
    -float price
    -PriceScale scale
    

    正如您所见,我严格应用了“一个产品有多个价格等级,一个价格等级有多个周期”的业务规则。

    我的问题:例如,当我处理产品类时,我不喜欢问自己“是否加载了priceScales?”(因为我不会每次需要产品时都加载)

    解决方案:

    1/延迟加载:我不喜欢它,因为你运行sql查询时甚至不知道它,你可能最终会遇到1+n查询问题(我正在处理价格计算系统,所以我真的需要确定执行哪个sql查询)

    2/总是加载它:我不喜欢它,因为如果我把这个逻辑应用到所有东西上,我最终会加载整个数据库。

    3/删除组成(即成员价格表),在这种情况下,处理价格表的最佳方法是什么:

    • 获取术语表<int,List<PriceScales>,其中键是产品id?

    4/在我的方法开始处添加我需要的价格表

    checkPriceScalesAreLoaded(productList);
    

    它看起来像是延迟加载,但它更显式。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  0
  •   Péter Török    14 年前

    对我来说,这听起来毕竟是一个持久性问题,与面向对象编程或组合没有太大关系。

    例如,对于Java和Hibernate,推荐的方法是使用默认的延迟抓取策略,然后测量性能并根据需要进行微调(有选择地在本地切换抓取策略)。您可以在单个映射/属性/查询上切换到快速获取或批处理/联接查询,而在其余部分则保留延迟获取策略。

        2
  •  0
  •   remi bourgarel    13 年前