Uploaded image for project: 'Hibernate ORM'
  1. HHH-10256

ClassCastException in ResultSetReturnImpl.java:75

    Details

    • Bug Testcase Reminder (view):

      Bug reports should generally be accompanied by a test case!

    • Last commented by a user?:
      true

      Description

      Since 4.3.6 we are getting an exception

      java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement cannot be cast to java.sql.CallableStatement
      at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:75)
      at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:449)
      at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:202)
      at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137)
      at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
      at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:100)
      at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:693)
      at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:92)
      at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1933)
      at org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:683)
      at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:894)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:360)
      at org.hibernate.loader.Loader.doList(Loader.java:2554)
      at org.hibernate.loader.Loader.doList(Loader.java:2540)
      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
      at org.hibernate.loader.Loader.list(Loader.java:2365)
      at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
      at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718)
      at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
      at de.repl.prl.service.impl.db.dao.InquiryDAO.find(InquiryDAO.java:81)
      at sun.reflect.GeneratedMethodAccessor930.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
      at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
      at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
      at $Proxy388.find(Unknown Source)
      at de.repl.prl.service.impl.PrlService.searchInquiry(PrlService.java:201)
      at sun.reflect.GeneratedMethodAccessor929.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
      at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:78)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
      at $Proxy393.searchInquiry(Unknown Source)
      at sun.reflect.GeneratedMethodAccessor928.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:212)
      at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:39)
      at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78)
      at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:114)
      at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:74)
      at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:51)
      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
      at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at de.repl.alert.monitor.ExceptionFilter.doFilter(ExceptionFilter.java:92)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

      We are using

      • hibernate-orm 4.3.9
      • spring 4.1.6
      • Oracle ojdbc6-11.2.0.3

      It seems with 4.3.6 the code

      ResultSetReturnImpl.java v.4.3.5
      @Override
      public ResultSet extract(PreparedStatement statement) {
      	// IMPL NOTE : SQL logged by caller
      	if ( statement instanceof CallableStatement ) {
      		// We actually need to extract from Callable statement.  Although
      		// this seems needless, Oracle can return an
      		// OracleCallableStatementWrapper that finds its way to this method,
      		// rather than extract(CallableStatement).  See HHH-8022.
      		final CallableStatement callableStatement = (CallableStatement) statement;
      		return extract( callableStatement );
      	}
      

      was changed to

      ResultSetReturnImpl.java 4.3.6
      @Override
      public ResultSet extract(PreparedStatement statement) {
      	// IMPL NOTE : SQL logged by caller
      	if (isTypeOf(statement, CallableStatement.class)) {
      		// We actually need to extract from Callable statement.  Although
      		// this seems needless, Oracle can return an
      		// OracleCallableStatementWrapper that finds its way to this method,
      		// rather than extract(CallableStatement).  See HHH-8022.
      		final CallableStatement callableStatement = (CallableStatement) statement;
      		return extract( callableStatement );
      	}
      

      In the given case our Statement is of type NewProxyPreparedStatement, so the method isTypeOf will return true for statement.isWrapperFor( type );

      ResultSetReturnImpl.java
      private boolean isTypeOf(final Statement statement, final Class<? extends Statement> type) {
            if (isJdbc4) {
                try {
                    // This is "more correct" than #isInstance, but not always supported.
                    return statement.isWrapperFor( type );
                }
                catch (SQLException e) {
                    // No operation
                }
                catch (Throwable e) {
                    // No operation. Note that this catches more than just SQLException to
                    // cover edge cases where a driver might throw an UnsupportedOperationException, AbstractMethodError,
                    // etc.  If so, skip permanently.
                    isJdbc4 = false;
                }
            }
            return type.isInstance( statement );
        }
      

      Unfortunately NewProxyPreparedStatement itself is of type Statement, not of type CallableStatement. Therefore, the exception occurs.

      The code in ResultSetReturnImpl was not changed for any newer version of hibernate-orm, so at the moment we are stuck with v.4.3.5.

      It seems someone else got the exact error as we now do but it did not seem to get any attention: https://forum.hibernate.org/viewtopic.php?f=1&t=1037030&view=previous

        Attachments

          Activity

            People

            • Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: