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