I hope I'll get a little time to post about this deeper collection situation
this weekend
can you please put here your deep queries so it'd be easier to compile that
post?


On Fri, Oct 3, 2008 at 7:28 PM, Andrew Melnichuk <[EMAIL PROTECTED]
> wrote:

> It works! Thanks alot for your help, Ken! It would so helpful if it would
> be mentioned in those blog post.
>
>
> On Fri, Oct 3, 2008 at 7:18 PM, Ken Egozi <[EMAIL PROTECTED]> wrote:
>
>> would
>>
>> from Blog b join fetch b.Posts p...
>> from Post p join fetch p.Tags t where...
>> from Tag t join fetch t.RelatedArticles a where ...
>>
>> work?
>>
>>
>>
>> On Fri, Oct 3, 2008 at 7:14 PM, Andrew Melnichuk <
>> [EMAIL PROTECTED]> wrote:
>>
>>> Ok i see.
>>> Yes, approach from blog post will work. But the deeper collection have to
>>> be fetched, the bigger cartesian product will be returned. I have 5-6 levels
>>> tree.
>>>
>>>
>>> On Fri, Oct 3, 2008 at 7:10 PM, Ken Egozi <[EMAIL PROTECTED]> wrote:
>>>
>>>> ok, here's why it's not working:
>>>>
>>>> when you access c.Customers, NH can't be sure that all of the relevant
>>>> customers for c are loaded. so it's going to the DB.
>>>> the approach described in the said blog post is loading the child
>>>> collection based on a join to the type it belongs to
>>>>
>>>> so, "select cs from Country c join fetch c.Customers cs where c = :c"
>>>> should work.
>>>>
>>>> On Fri, Oct 3, 2008 at 7:04 PM, Andrew Melnichuk <
>>>> [EMAIL PROTECTED]> wrote:
>>>>
>>>>> Just to be sure... if NH logs sql statement, is it 100% will reach db?
>>>>> I'm just using SQLite inmemory mode, can't use profiler.
>>>>>
>>>>>
>>>>> On Fri, Oct 3, 2008 at 7:03 PM, Andrew Melnichuk <
>>>>> [EMAIL PROTECTED]> wrote:
>>>>>
>>>>>> I changed
>>>>>> Assert.That(NHibernateUtil.IsInitialized(c.Customers));
>>>>>> to
>>>>>> Assert.That(c.Customers.Count == 2);
>>>>>>
>>>>>> and it still hits the db, here is the SQL
>>>>>>
>>>>>> // for root
>>>>>> select country0_.Id as Id0_, country0_.Name as Name0_ from Country
>>>>>> country0_ where (Name='Germany' )
>>>>>>
>>>>>> // for collection
>>>>>> select customer0_.Id as Id1_, customer0_.Name as Name1_,
>>>>>> customer0_.CountryId as CountryId1_ from Customer customer0_ where
>>>>>> ([EMAIL PROTECTED] )and(customer0_.Name='GermanyCustomer1' ); @p0 =
>>>>>> '1'
>>>>>>
>>>>>> // for collection.count
>>>>>> SELECT customers0_.CountryId as CountryId1_, customers0_.Id as Id1_,
>>>>>> customers0_.Id as Id1_0_, customers0_.Name as Name1_0_,
>>>>>> customers0_.CountryId as CountryId1_0_ FROM Customer customers0_ WHERE
>>>>>> [EMAIL PROTECTED]; @p0 = '1'
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, Oct 3, 2008 at 6:54 PM, Ken Egozi <[EMAIL PROTECTED]> wrote:
>>>>>>
>>>>>>> try to simply access the c.Customers and check (via show-sql or DB
>>>>>>> profiler) that the DB is not being hit, but the customers data is being
>>>>>>> hooked from the session cache.
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Oct 3, 2008 at 6:40 PM, Andrew Melnichuk <
>>>>>>> [EMAIL PROTECTED]> wrote:
>>>>>>>
>>>>>>>> Hi all.
>>>>>>>>
>>>>>>>> I have a complex object graph. There is a root entity which has a
>>>>>>>> set of collections (some of them are pretty big), entities in 
>>>>>>>> collections
>>>>>>>> have their own collections etc.. - a kind of tree. I need to fetch 
>>>>>>>> this tree
>>>>>>>> with minimum performance hit for database. I have tried 2 options for 
>>>>>>>> now:
>>>>>>>> 1st - load root entity, and then navigate through properties to load
>>>>>>>> all child and grandchild collections, ofcourse set fetch="subselect" in
>>>>>>>> mapping file before, to prevent select n+1 problem
>>>>>>>> 2nd - use approach, described here
>>>>>>>> http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/06/eager-loading-aggregate-with-many-child-collections.aspx,
>>>>>>>> where different collections load by different queries, but session is 
>>>>>>>> smart
>>>>>>>> enough, to merge different result to object graph, initializing 
>>>>>>>> different
>>>>>>>> collections.
>>>>>>>>
>>>>>>>> But i can't use 1st approach, because i can't define fetch plan on a
>>>>>>>> global level (number of reasons), and i can't use 2nd approach, 
>>>>>>>> because it
>>>>>>>> seems that it works fine for 1st level collection only, selecting 
>>>>>>>> deeper
>>>>>>>> level collections will produce cartesian product, which will grow with 
>>>>>>>> level
>>>>>>>> of query of collection.
>>>>>>>>
>>>>>>>> What i thought about, is would it be possible to use approach based
>>>>>>>> on several queries, like 2nd approach i mentioned. The difference is i 
>>>>>>>> tried
>>>>>>>> to start fetching not from the root entity level, but from the level i 
>>>>>>>> have
>>>>>>>> to fetch next, after i already fetched with previous query. For 
>>>>>>>> example:
>>>>>>>>
>>>>>>>>         [Test]
>>>>>>>>         public void Test1()
>>>>>>>>         {
>>>>>>>>             // load root entity
>>>>>>>>             Country c = _session
>>>>>>>>                 .CreateQuery("from Country where Name = 'Germany'")
>>>>>>>>                 .List<Country>()[0];
>>>>>>>>
>>>>>>>>             // trying to load 1st level child collection
>>>>>>>>             _sess
>>>>>>>>                 .CreateQuery("from Customer cs where cs.Country =
>>>>>>>> :c")
>>>>>>>>                 .SetParameter("c", c)
>>>>>>>>                 .List();
>>>>>>>>
>>>>>>>>             Assert.That(NHibernateUtil.IsInitialized(c.Customers));
>>>>>>>> // fails
>>>>>>>>         }
>>>>>>>>
>>>>>>>> I thought that session will initialize Country.Customers collection,
>>>>>>>> but it is not.
>>>>>>>> Ofcourse i could use eager join for this collection and others at
>>>>>>>> the same level, but as i said this will causes cartesian product for 
>>>>>>>> deeper
>>>>>>>> collections.
>>>>>>>> I'm not sure that what i did is valid, maybe it is invalid by
>>>>>>>> design, however it seems that session can initialize customers 
>>>>>>>> collection,
>>>>>>>> since it "knows" to which country selected customers belongs.
>>>>>>>>
>>>>>>>> Just wanted to ask, how people solve same problems.
>>>>>>>>
>>>>>>>> --
>>>>>>>> Best regards,
>>>>>>>> Andrew Melnichuk
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Ken Egozi.
>>>>>>> http://www.kenegozi.com/blog
>>>>>>> http://www.musicglue.com
>>>>>>> http://www.castleproject.org
>>>>>>> http://www.gotfriends.co.il
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards,
>>>>>> Andrew Melnichuk
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Best regards,
>>>>> Andrew Melnichuk
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Ken Egozi.
>>>> http://www.kenegozi.com/blog
>>>> http://www.musicglue.com
>>>> http://www.castleproject.org
>>>> http://www.gotfriends.co.il
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> Best regards,
>>> Andrew Melnichuk
>>>
>>>
>>>
>>
>>
>> --
>> Ken Egozi.
>> http://www.kenegozi.com/blog
>> http://www.musicglue.com
>> http://www.castleproject.org
>> http://www.gotfriends.co.il
>>
>>
>>
>
>
> --
> Best regards,
> Andrew Melnichuk
>
> >
>


-- 
Ken Egozi.
http://www.kenegozi.com/blog
http://www.musicglue.com
http://www.castleproject.org
http://www.gotfriends.co.il

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to