ClassCastException caused by method in SpringHibernateDaoBase.vsl -----------------------------------------------------------------
Key: HIB-212 URL: http://jira.andromda.org/browse/HIB-212 Project: Hibernate Cartridge Type: Bug Versions: 3.2-RC1 Environment: WindowsXP, jBoss Reporter: HB Assigned to: Carlos Cuenca Priority: Minor A ClassCastException is caused by the ${valueObjectRef.transformationToCollectionMethodName} method in SpringHibernateDaoBase.vsl when called on a DAO from within another DAO. [code] /** * @see ${entity.fullyQualifiedDaoName}#${valueObjectRef.transformationToCollectionMethodName}(java.util.Collection) */ public final void ${valueObjectRef.transformationToCollectionMethodName}(java.util.Collection entities) { if (entities != null) { org.apache.commons.collections.CollectionUtils.transform(entities, ${valueObjectRef.transformationAnonymousName}); } } [/code] The exception is [code] 2007-04-09 15:16:41,535 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Initiating transaction rollback on commit exception java.lang.ClassCastException: my.test.DetailsVO at org.hibernate.type.EntityType.toLoggableString(EntityType.java:145) at org.hibernate.type.CollectionType.toLoggableString(CollectionType.java:147) at org.hibernate.pretty.Printer.toString(Printer.java:53) at org.hibernate.pretty.Printer.toString(Printer.java:90) at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:91) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730) at org.springframework.orm.hibernate3.SessionFactoryUtils$SpringSessionSynchronization.beforeCommit(SessionFactoryUtils.java:880) at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:656) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:481) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:468) at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:258) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) at $Proxy89.getCartaPorId(Unknown Source) at my.test.LetterServiceWSDelegator.getLetterById(LetterServiceWSDelegator.java:51) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186) at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323) at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454) at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281) at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595) 2007-04-09 15:16:41,535 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Rolling back JTA transaction [/code] I set up a test like this ... [code] DetailsVO[] aryDets; boolean bShowBug = true; if (bShowBug) { Collection<?> dets = source.getDetails(); daoDetails.toDetailsVOCollection(dets); aryDets = (DetailsVO[]) dets.toArray(new DetailsVO[dets.size()]); } else { aryDets = new DetailsVO[source.getDetails().size()]; Iterator itr = source.getDetails().iterator(); int ii = 0 ; while (itr.hasNext()) { aryDets[ii++] = daoDetails.toDetailsVO((Details) itr.next()); } } target.setDetails(aryDets); [/code] The ClassCastException only occurs when ShowBug is true. Some observations... [list] - The above code is in the method [i]toMasterVO(MasterVO source, MasterVO target)[/i] in a class [i]MasterDaoImpl[/i]. In other words, I'm calling methods in the DetailsDao from within the MasterDao. - The exception occurs from within the AOP stuff after exiting the method [i]getLetterById[/i] on the [i]LetterService[/i] at the point Hibernate tries to flush the session. [/list] I suspect that Hibernate is trying to flush the original my.test.Details array, but finds a my.test.DetailsVO array instead. I suggest that the method [i]${valueObjectRef.transformationToCollectionMethodName}[/i] should be deprecated and a new one offered that generates code like this: [code] /** * @see my.test.DetailsDao#toDetailsVOCollection(java.util.Collection) */ public final void toDetailsVOCollection(java.util.Collection<Details> sourceEntities, java.util.Collection<DetailsVO> targetEntities) { if ((sourceEntities != null) && (targetEntities != null)) { Iterator itr = sourceEntities.iterator(); while (itr.hasNext()) { targetEntities.add((DetailsVO) DETAILSVO_TRANSFORMER.transform(itr.next())); } } } [/code] -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.andromda.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV