 <p>Specify a <code>batch-size</code> on the <code>Category.ChildCategories</code> mapping. That will cause NHibernate to fetch children in batches of the specified size, not one at a time (which will alleviate the N+1 problem).</p> <p>If you are using <code>.hbm</code> files, you can specify the <code>batch-size</code> like this:</p> <pre><code>&lt;bag name="ChildCategories" batch-size="30"&gt; </code></pre> <p>or using fluent mapping</p> <pre><code>HasMany(x =&gt; x.ChildCategories).KeyColumn("ParentId").BatchSize(30); </code></pre> <p>See the <a href="http://nhforge.org/doc/nh/en/index.html#performance-fetching-batch" rel="nofollow">NHibernate documentation</a> for more info.</p> <p><strong>EDIT</strong></p> <p>Ok, I believe I understand your requirements. With the following configuration</p> <pre><code>HasManyToMany&lt;Item&gt;(x =&gt; x.ChildCategories) .Table("CategoryLink") .ParentKeyColumn("ParentId") .ChildKeyColumn("CategoryID") .BatchSize(100) .Not.LazyLoad() .Fetch.Join(); </code></pre> <p>you should be able to get the entire hierarchy in one call using the following line.</p> <pre><code>var result = session.CreateCriteria(typeof(Category)).List(); </code></pre> <p>For some reason, retrieving a single category like this</p> <pre><code>var categoryId = 1; var result = session.Get&lt;Category&gt;(categoryId); </code></pre> <p>results in one call per level in the hierarchy. I believe this should still significantly reduce the number of calls to the database, but I was not able to get the example above to work with a single call to the database.</p>