Hi,
I am not sure this is a bug, so I thought i would post it to this mailing list first:
here is the sql map snippet:
<dynamic-mapped-statement name="insertArtistGenres">
DELETE FROM artist_genres WHERE customer_id = #customerID;
<dynamic>
<iterate property="artistGenresList">
INSERT INTO artist_genres (customer_id, genre_id)
VALUES ( #customerID#, #artistGenresList[]# );
</iterate>
</dynamic>
</dynamic-mapped-statement>I am basically trying to insert a series of values to an intermediate table so that a 1:M relationship is established as such:
an artist may have 0 or more genres associated with it.
the dao java code looks like this:
public Object insert( Object parameterObject ) throws DaoException
{
GenerateID.artistID(parameterObject);
List statements = new LinkedList();
statements.add("insertArtist");
statements.add("updateArtistAddress");
statements.add("insertArtistGenres");
return super.batchUpdate( statements, parameterObject );
}
the dao class extends a BaseDao class which executes the batch updates:sqlMap.executeUpdate( (String)statements.get(i), parameterObject ); //loop on the statements list
both the insertArtist and updateArtistAddress work fine,
The bean passed is initialised properly - no faults there.
only the last statement "insertArtistGenres" fails miserably and causes a rollback (see stacktrace below)
error message:
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:259)
at com.ibatis.db.sqlmap.dynamic.DynamicMappedStatement.getSqlStatement(Unknown Source)
at com.ibatis.db.sqlmap.MappedStatement.executeUpdate(Unknown Source)
at com.ibatis.db.sqlmap.SqlMap.executeUpdate(Unknown Source)
at com.blabla.dao.BaseDao.batchUpdate(BaseDao.java:192)
at com.blabla.dao.ArtistDao.insert(ArtistDao.java:30)
at com.blabla.action.DefaultDispatchAction.insert(DefaultDispatchAction.java:44)
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:324)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1480)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:524)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)
I am running a Struts Webapp using tomcat 5.0, with postgres 8.0 beta5.0 on a win32 platform.
I really don't understand why the dynamic multiple insert does not work.
Please help!

