-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 14 posts ] 
Author Message
 Post subject: Why does hibernate always load object from many-to-one ?
PostPosted: Wed Jun 28, 2006 2:09 pm 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
What is the reason why hibernate always load object fom database from many-to-one relationship?

For example, if entity A contains link to enity B (as many-to-one), then hibernate will calls SessionImpl.internalLoad() for entity B and then in DefaultLoadEventListener calls proxyOrLoad with option:

Code:
   public static final LoadType INTERNAL_LOAD_NULLABLE = new LoadType("INTERNAL_LOAD_NULLABLE")
         .setAllowNulls(true)
         .setAllowProxyCreation(false)
         .setCheckDeleted(false)
         .setNakedEntityReturned(false);


This option disables using proxy (setAllowProxyCreation) in case when entity not loaded. ManyToOne has option "ignoreNotFound" which setted to true, but still setAllowProxyCreation(false) is used.

Can this be changed or are there some other reasons to not allow proxy creation?

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 28, 2006 6:20 pm 
Expert
Expert

Joined: Thu Dec 23, 2004 9:08 pm
Posts: 2008
Hibernate doesn't always eagerly load objects related via a many-to-one association. It must be your mapping that's causing the effect. Have you got fetch="join" or lazy="false" set?

_________________
Code tags are your friend. Know them and use them.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 29, 2006 6:11 am 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
tenwit wrote:
Hibernate doesn't always eagerly load objects related via a many-to-one association. It must be your mapping that's causing the effect. Have you got fetch="join" or lazy="false" set?


No, all many-to-one have lazy setting.
@ManyToOne(fetch = FetchType.LAZY)

The fact is hibernate doesn't ever look at eager/laxy settings - it firstly looks at nullable setting:

Code:
      // todo : remove
      LoadEventListener.LoadType type = nullable ?
            LoadEventListener.INTERNAL_LOAD_NULLABLE :
            eager ? LoadEventListener.INTERNAL_LOAD_EAGER : LoadEventListener.INTERNAL_LOAD_LAZY;


So, only nullable property is used to determine load options.

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 29, 2006 6:16 pm 
Expert
Expert

Joined: Thu Dec 23, 2004 9:08 pm
Posts: 2008
I have to admit to not knowing much about annotations, but assuming that fetch=FetchType.LAZY is equivalent to fetch="select", then that's not enough for many-to-one. You also need to set lazy="proxy".

Even if that isn't the problem, I'm sure that there's something in your setup that is causing this. I am currently looking at a proxied many-to-one in my debugger, it definitely works.

_________________
Code tags are your friend. Know them and use them.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 29, 2006 9:42 pm 
Newbie

Joined: Thu Jun 29, 2006 10:58 am
Posts: 4
I just posted a similar question:

http://forum.hibernate.org/viewtopic.php?t=961430

As far as I can tell from attempting almost every combination of settings, a call to .get() or .load() sucks in the whole object structure, like it or not. I've traced through the source code and that's just what it does. It's a project killer, really, and I'm going to have a hell of a time working around it.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 29, 2006 9:44 pm 
Newbie

Joined: Thu Jun 29, 2006 10:58 am
Posts: 4
...and, please, if you figure out the trick to this, please reply here or at my posting.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 1:52 am 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
tenwit wrote:
Even if that isn't the problem, I'm sure that there's something in your setup that is causing this. I am currently looking at a proxied many-to-one in my debugger, it definitely works.


I didn't say that it doesn't works :) I said, it loads all ONE-side entities, and i don't want it too.

Need to create test case fo this :)

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 2:39 am 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
tenwit wrote:
Even if that isn't the problem, I'm sure that there's something in your setup that is causing this. I am currently looking at a proxied many-to-one in my debugger, it definitely works.


Is this field (at many side) nullable? It is nullable in my case. And hibernate doesn't want to create proxies

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 2:43 am 
Expert
Expert

Joined: Thu Dec 23, 2004 9:08 pm
Posts: 2008
I haven't explicitly set it nullable or not nullable. That may well be the deciding factor.

_________________
Code tags are your friend. Know them and use them.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 4:03 am 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
Add bug to buglist:

http://opensource.atlassian.com/project ... e/HHH-1868

Add test case to it.

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 9:12 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Hibernate does not load many to one associations marked as lazy

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 7:46 pm 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
userx wrote:
As far as I can tell from attempting almost every combination of settings, a call to .get() or .load() sucks in the whole object structure, like it or not. I've traced through the source code and that's just what it does. It's a project killer, really, and I'm going to have a hell of a time working around it.


Would you mind describe you second level cache settings?

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 7:49 pm 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
emmanuel wrote:
Hibernate does not load many to one associations marked as lazy


Then WHY does followed stack trace appear? All collections are lazy.

Code:
...
        at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:633)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:415)
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
        at org.hibernate.loader.Loader.doQuery(Loader.java:661)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1784)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
        at org.hibernate.loader.entity.BatchingEntityLoader.load(BatchingEntityLoader.java:82)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2855)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:393)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:374)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
        at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:274)
        at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196)
        at org.hibernate.type.TypeFactory.assemble(TypeFactory.java:404)
        at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:96)
        at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:82)
        at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:540)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:494)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:356)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
        at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:193)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:274)
        at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196)
        at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:121)
        at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2085)
        at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2050)
        at org.hibernate.loader.Loader.list(Loader.java:2020)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:62)
        at ru.arptek.arpsite.data.AbstractHibernateFlatHome.find(AbstractHibernateFlatHome.java:264)


As you can see, there IS loading object from lazy property.

_________________
--
Sergey Vladimirov


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 30, 2006 8:01 pm 
Newbie

Joined: Tue Jan 10, 2006 11:59 am
Posts: 17
One more stack trace with the same simptom:

Code:
        at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:633)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497)
        at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:415)
        at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
        at org.hibernate.loader.Loader.doQuery(Loader.java:661)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1784)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
        at org.hibernate.loader.entity.BatchingEntityLoader.load(BatchingEntityLoader.java:82)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2855)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:393)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:374)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
        at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:274)
        at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196)
        at org.hibernate.type.TypeFactory.assemble(TypeFactory.java:404)
        at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:96)
        at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:82)
        at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:540)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:494)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:356)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
        at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:193)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:274)
        at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196)
        at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:121)
        at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2085)
        at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2050)
        at org.hibernate.loader.Loader.list(Loader.java:2020)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
        at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:62)
        at ru.arptek.arpsite.data.AbstractHibernateFlatHome.find(AbstractHibernateFlatHome.java:264)

_________________
--
Sergey Vladimirov


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 14 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.