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

Reply via email to