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!

Reply via email to