【问题标题】:NHibernate. Load Entity with 2 query and merge休眠。使用 2 个查询和合并加载实体
【发布时间】:2013-02-10 16:58:37
【问题描述】:

我有很多子对象集合的复杂实体,它们也很复杂:

public class Order : AdvancedBaseOrder, ICheckable
{
    public virtual ICollection<RouteUnit> RouteUnits
    public virtual ICollection<Invoice> Invoices
    public virtual ICollection<Call> Calls;
    public virtual ICollection<Payment> Payments;
    ......
}

我的支付类聚合了很多其他对象

public class Payment:  ICheckable
{
    public virtual A A;
    public virtual B B;
    public virtual C C;
    public virtual D D;
    ......
}

我想通过 2 个查询获得订单:

  1. 加载订单实体而不付款 (FetchMode.Lazy)
  2. 按订单加载付款并加入其对象
  3. 合并\合并订单及其付款

我不希望 nhib 延迟加载支付,因为我想覆盖支付对象的获取策略。

所以我的问题是如何将两个查询结果合并到一个聚合中 .谢谢

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    在这种情况下,batch-size="25" 设置可以为您完成这项工作。在文档中阅读更多信息:19.1.5. Using batch fetching

    batch size cane 应用于 classcollection 映射:

    支付类

    <class name="Payment" batch-size="10">...</class>
    

    收款

    <class name="Order">
        <set name="Payments" batch-size="3">
            ...
        </set>
    </class>
    

    简而言之,批处理是如何工作的:NHibernates 加载所有 Orders 的集合。然后基于批量大小设置(例如 25)创建对 Payments 的少量调用,这些调用由刚刚加载的 订单IDs 过滤:

    WHERE OrderId in (@o1, @o2, @O3...@o25)

    合并将在 NHibernate 会话中为您完成。根据我的经验,这是最强大的映射... Lazy & Batching。

    【讨论】:

    • 我知道这个调音(bacth-size)。但是我需要在加载惰性实体时管理休眠获取策略的方式
    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多