当按主键查询时,非hibernate急切加载

本文关键字:hibernate 加载 查询 | 更新日期: 2023-09-27 18:10:10

在我的存储库中,我通过其主键(chainNumber)返回对象(Chain)。Chain有一组步骤(ChainStep)

通过主代码查询时,我如何快速加载步骤?

这是我的仓库代码。

public Chain Get(string chainNumber)
{
    var chain = session.Get<Chain>(chainNumber);
    if (chain == null)
    {
        throw new ObjectNotFoundException(
            string.Format("Chain not found for number: {0}.", chainNumber));
    }
    return chain;
}

这是我的映射:

public class ChainMap: ClassMap<Chain>
{
    public ChainMap()
    {
        Id(x => x.ChainNumber).Length(4).Not.Nullable();
        //More properties
        HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse();
    }
}

当按主键查询时,非hibernate急切加载

告诉NHibernate 总是快速加载集合,你可以在映射中使用.Not.LazyLoad()。这应该对你有用:

public class ChainMap: ClassMap<Chain>
{
    public ChainMap()
    {
        // ...
        HasMany(x => x.Steps).Cascade.AllDeleteOrphan().Inverse().Not.LazyLoad();
    }
}

如果只是在特定的时间需要快速加载集合,可以修改Get方法,使用QueryFetch:

public Chain Get(string chainNumber)
{
    var chain = session.Query<Chain>()
                    .Where(chain => chain.ChainNumber == chainNumber)
                    .Fetch(chain => chain.Steps)
                    .Single();
    if (chain == null)
    {
        throw new ObjectNotFoundException(
            string.Format("Chain not found for number: {0}.", chainNumber));
    }
    return chain;
}

第二种方法的优点是允许延迟加载保持此类型的默认值(用于当子集合可能不会被代码库的其他部分立即访问时)。

注意:如果没有一个匹配,上面对Single的调用将抛出异常,所以在

下面抛出异常是多余的。