Well, i'm not sure i can post queries from my project, but i can post test
queries, for 3-4 level object graph, and do it only next week, realy busy
with proejct. Thanks again for help.

On Fri, Oct 3, 2008 at 7:36 PM, Ken Egozi <[EMAIL PROTECTED]> wrote:

> 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
>
> >
>


-- 
Best regards,
Andrew Melnichuk

--~--~---------~--~----~------------~-------~--~----~
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