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