[ 
https://issues.apache.org/jira/browse/JXPATH-110?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12554142
 ] 

mbenson edited comment on JXPATH-110 at 12/22/07 10:31 AM:
---------------------------------------------------------------

I could simply say "this looks like a problem with Hibernate" and leave it at 
that.  However, since I myself have worked for some years with Hibernate (and 
like it, I might add), I'll go into a little more detail:
  The javadoc for LazyInitializationException confirms, as I suspected from 
reading your summary, that you are trying (via JXPath in this case) to access 
parts of the object graph that have been set for lazy retrieval (and this is 
the important part) _outside_of_ an active Session.  Since I don't know what 
type of application you're working with, I couldn't very well say what strategy 
you need to use to be sure that your JXPath access is taking place within an 
active Session scope, but that's probably what you need to do.  Other options 
might include not using lazy loading under certain circumstances (not sure how 
to accomplish that with annotation-based Hibernate, or indeed whether there is 
some annotation trickery that would alleviate your scoping issues).  Finally, 
you might also try making a deep copy of your object graph into a 
non-Hibernated structure inside your session scope, then using JXPath on that 
copy outside of a session.  You can email me personally if you need info on how 
I do that (when I want to take a Hibernated graph and serialize it in 
fully-populated, non-Hibernated form).

      was (Author: mbenson):
    I could simply say "this looks like a problem with Hibernate" and leave it 
at that.  However, since I myself have worked for some years with Hibernate 
(and like it, I might add), I'll go into a little more detail:
  The javadoc for LazyInitializationException confirms, as I suspected from 
reading your summary, that you are trying (via JXPath in this case) to access 
parts of the object graph that have been set for lazy retrieval (and this is 
the important part) _outside_of_ an active Session.  Since I don't know what 
type of application you're working with, I couldn't very well say what strategy 
you need to use to be sure that your JXPath access is taking place within an 
active Session scope, but that's probably what you need to do.  Other options 
might include not using lazy loading (not sure how to accomplish that with 
annotation-based Hibernate, or indeed whether there is some annotation trickery 
that would alleviate your scoping issues).  Finally, you might also try making 
a deep copy of your object graph into a non-Hibernated structure inside your 
session scope, then using JXPath on that copy outside of a session.  You can 
email me personally if you need info on how I do that (when I want to take a 
Hibernated graph and serialize it in fully-populated, non-Hibernated form).
  
> When JXPathContext.newContext(object) holds a collection of Hibernate proxy 
> entities, and search performed, LazyInitializationException illegal access to 
> loading collection
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: JXPATH-110
>                 URL: https://issues.apache.org/jira/browse/JXPATH-110
>             Project: Commons JXPath
>          Issue Type: Bug
>    Affects Versions: 1.2 Final
>         Environment: Windows XP Professional, Java 5, Tomcat 5.5.20, 
> hibernate-annotations 3.3.0.ga, hibernate core 3.2.2.ga, springframework 2.0.7
>            Reporter: eliot clingman
>
> In the O/R model The entity WirelessDevice has all its properties with fetch 
> = FetchType.LAZY
> First, using annotation style Hibernate,  I find all wirelessDevices 
> (proxies) with a named query, with some but not all of the collection 
> properties fetched.  What this means is that a property xyz must be accessed 
> from the wirelessDevice proxy as follows getXyz(), NOT by invoking xyz 
> directly.  Because accessing the latter way will result in the exception 
> "LazyInitializationException: illegal access to loading collection."  
> However, when getXyz() is invoked, the proxy will return the correct value 
> (because it is attached to a live Hibernate session).
> FYI, here is the named Hibernate query: "select d from WirelessDevice d left 
> join fetch d.marketData marketData left join fetch d.wirelessTechnologyTypes 
> left join fetch d.anatomy anatomy left join fetch anatomy.geometry".
> Any way when I do the following in JxPath , a LazyInitializationException 
> occurs presumable because properties are not being accessed via getters, but 
> rather directly:
>               JXPathContext context = JXPathContext.newContext(blah blah);
>               Iterator<T> i = 
> context.iterate("/wirelessDevices[marketData/operators/address/countryType/regionType/id='8']");
> HEre is the exact stack trace:
> org.hibernate.LazyInitializationException 2007-12-21 18:52:07,915 -- ERROR -- 
> illegal access to loading collection
> org.hibernate.LazyInitializationException: illegal access to loading 
> collection
>       at 
> org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:341)
>       at 
> org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
>       at 
> org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:109)
>       at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
>       at 
> org.apache.commons.jxpath.util.ValueUtils.getLength(ValueUtils.java:141)
>       at 
> org.apache.commons.jxpath.ri.model.beans.BeanPropertyPointer.getLength(BeanPropertyPointer.java:196)
>       at 
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.getLength(PropertyIterator.java:295)
>       at 
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPositionIndividualProperty(PropertyIterator.java:148)
>       at 
> org.apache.commons.jxpath.ri.model.beans.PropertyIterator.setPosition(PropertyIterator.java:127)
>       at 
> org.apache.commons.jxpath.ri.axes.ChildContext.setPosition(ChildContext.java:106)
>       at 
> org.apache.commons.jxpath.ri.axes.ChildContext.nextNode(ChildContext.java:89)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:322)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:321)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:321)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.nextSet(EvalContext.java:321)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.performIteratorStep(EvalContext.java:159)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.hasNext(EvalContext.java:118)
>       at 
> org.apache.commons.jxpath.ri.compiler.CoreOperationCompare.contains(CoreOperationCompare.java:86)
>       at 
> org.apache.commons.jxpath.ri.compiler.CoreOperationCompare.equal(CoreOperationCompare.java:73)
>       at 
> org.apache.commons.jxpath.ri.compiler.CoreOperationEqual.computeValue(CoreOperationEqual.java:33)
>       at 
> org.apache.commons.jxpath.ri.axes.PredicateContext.nextNode(PredicateContext.java:81)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.performIteratorStep(EvalContext.java:155)
>       at 
> org.apache.commons.jxpath.ri.EvalContext.hasNext(EvalContext.java:118)
>       at 
> org.apache.commons.jxpath.ri.compiler.Expression$ValueIterator.hasNext(Expression.java:128)
>       at 
> com.qualcomm.crowd.dao.InMemoryQueryEngine.findInMemoryEntitysByCriteria(InMemoryQueryEngine.java:50)
>       at 
> com.qualcomm.crowd.service.WirelessDeviceManagerImpl.findInMemoryWirelessDevicesByCriteria(WirelessDeviceManagerImpl.java:99)
>       at 
> com.qualcomm.crowd.service.WirelessDeviceManagerImpl.findOperatorAliasesByRegionType(WirelessDeviceManagerImpl.java:140)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>       at java.lang.reflect.Method.invoke(Unknown Source)
>       at 
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
>       at 
> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
>       at 
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
>       at $Proxy40.findOperatorAliasesByRegionType(Unknown Source)
>       at 
> com.qualcomm.crowd.controller.WirelessDeviceController.findOperatorAliasesByRegionType(WirelessDeviceController.java:298)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>       at java.lang.reflect.Method.invoke(Unknown Source)
>       at 
> org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:446)
>       at 
> org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:384)
>       at 
> org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
>       at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)
>       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>       at java.lang.reflect.Method.invoke(Unknown Source)
>       at 
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
>       at 
> org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:50)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:160)
>       at 
> org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
>       at 
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
>       at 
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
>       at $Proxy42.handleRequest(Unknown Source)
>       at 
> org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
>       at 
> org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:858)
>       at 
> org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
>       at 
> org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
>       at 
> org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
>       at 
> org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
>       at 
> org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:166)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
>       at 
> org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
>       at 
> org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
>       at 
> org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
>       at 
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
>       at 
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
>       at 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
>       at 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
>       at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
>       at java.lang.Thread.run(Unknown Source)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to