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