As you've seen, <selectKey> is really not compatible with batch execution.
 Batches are for executing the same statement over and over again.
 <selectKey> interferes with that.  So instead of
insert
insert
insert
insert

You have

insert
select
insert
select
insert
select
insert
select

iBATIS makes a transaction boundary after each group of unique statements.
 In the first case above there is one transaction, in the second there are 8
transactions.  And...the generated keys don't survive past a transaction
boundary.

This may be more than you wanted to know, but that's why it is failing.

If you are doing a mass insert, it's probably better to turn of the
generated keys and generate them yourself anyway.

Jeff Butler




On Thu, Jul 9, 2009 at 8:22 AM, Westhveg <westhstud...@gmail.com> wrote:

>
> Yes, I know. I specify the 'keyProperty' in 'selectKey' and it works well
> for
> single execution. The problem is when I use the Batch process, then, it
> returns 0 and record doesn't be updated.
>
>
> meindert-3 wrote:
> >
> > I was saying the id (keyProperty) on your records...
> > As far as I know the id property is updated by ibatis (when you tell it
> > what the key property is)
> > Eg; <selectKey resultClass="java.lang.Integer" keyProperty="uploadLogId"
> >
> > The uploadLogId property of the record you provided as insert parameter
> > should have been updated to the generated primary key
> > So you can loop through the list and check this property after the batch
> > has been executed
> >
> >
> > -----Original Message-----
> > From: Westhveg [mailto:westhstud...@gmail.com]
> > Sent: 09 July 2009 02:27 PM
> > To: user-java@ibatis.apache.org
> > Subject: RE: Retrieve inserted id in mass insert using SqlMapExecutor.
> >
> >
> > No, I'm not able.
> >
> > There are two ways to execute batch process, 'executeBatch()' and
> > 'executeBatchDetailed()'. The first return an Integer with the total
> > number
> > of affected rows. The second returns a List of 'BatchResult', where it
> > have
> > one BatchResult for each iBatis batched operation (in my case we have
> only
> > one, 'insertRecord'). But the BatchResult object doesn't contain
> > information
> > about the retrieved ID or Object, it's methods are:
> >
> >  · java.lang.String getSql()
> >  · java.lang.String getStatementId()
> >  · int[] getUpdateCounts()
> >  · void setUpdateCounts(int[] updateCounts)
> >
> > see:
> >
> http://ibatis.apache.org/docs/java/dev/com/ibatis/sqlmap/engine/execution/SqlExecutor.html
> >
> http://ibatis.apache.org/docs/java/dev/com/ibatis/sqlmap/engine/execution/BatchResult.html
> >
> >
> >
> > Thanks,
> >
> > Westhveg
> >
> >
> >
> >
> >
> >
> > meindert-3 wrote:
> >>
> >> Ok, don't know for sure, but wouldn't you be able to loop through the
> >> list
> >> after the batch has executed and check the id (keyProperty) on your
> >> records?
> >>
> >>
> >> -----Original Message-----
> >> From: Westhveg [mailto:westhstud...@gmail.com]
> >> Sent: 09 July 2009 11:47 AM
> >> To: user-java@ibatis.apache.org
> >> Subject: RE: Retrieve inserted id in mass insert using SqlMapExecutor.
> >>
> >>
> >> Hello meindert-3,
> >>
> >> Thanks for your reply.
> >>
> >> This is correct and in my case is already working. But my problem is
> when
> >> I
> >> use batch processes. Remembering the code:
> >>
> >> public List<T> createRecordsMassively(final List<T> records) {
> >>
> >>         getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
> >>
> >>             public Object doInSqlMapClient(SqlMapExecutor executor)
> >> throws
> >> SQLException {
> >>                 executor.startBatch();
> >>
> >>                 for (T record : records) {
> >>                         executor.insert("insertRecord", record);
> >>                 }
> >>
> >>                 //List<BatchResult> result =
> >> executor.executeBatchDetailed();
> >>                 int rowsAffected = executor.executeBatch();
> >>                 return new Integer(rowsAffected);
> >>             }
> >>         });
> >>
> >>         /*Deal with result*/
> >>
> >> }
> >>
> >> In the line 'executor.insert("insertRecord", record);' I always recieve
> >> 0.
> >> I
> >> think this is because is a batch process and it's being executed after,
> >> in
> >> line 'executor.executeBatch()'.
> >> So, just for clarify, if I execute 'insertRecord' WITHOUT batch process,
> >> it
> >> returns the ID. If I use Batch process (the reason of this post) I
> always
> >> recieve 0.
> >>
> >>
> >> Thanks,
> >>
> >> Westhveg
> >>
> >>
> >> meindert-3 wrote:
> >>>
> >>> Put the name of the property that hold the ID in the sql map and the
> >>> record get's updated with the id and your insert statement returns the
> >>> id
> >>> object
> >>>
> >>> Here is MS SQl example, just replace SELECT @@IDENTITY with the correct
> >>> query for Mysql to fetch the ID
> >>> <insert id="ibatorgenerated_insert" parameterClass=".." >
> >>>     <!--
> >>>       WARNING - This element is automatically generated by Apache
> iBATIS
> >>> ibator, do not modify.
> >>>       This element was generated on Fri Mar 06 08:29:29 GMT 2009.
> >>>     -->
> >>>    insert into online_upload_log (id, userid, actmonth, basemonth,
> >>> datestamp, result)
> >>>     values (#uploadLogId:INTEGER#, #userid:INTEGER#,
> #actmonth:INTEGER#,
> >>> #basemonth:BIT#,
> >>>       #datestamp:TIMESTAMP#, #result:LONGVARCHAR#)
> >>>    <selectKey resultClass="java.lang.Integer" keyProperty="uploadLogId"
> >>> >
> >>>       SELECT @@IDENTITY
> >>>    </selectKey>
> >>> </insert>
> >>>
> >>> Meindert
> >>>
> >>> -----Original Message-----
> >>> From: Westhveg [mailto:westhstud...@gmail.com]
> >>> Sent: 09 July 2009 10:34 AM
> >>> To: user-java@ibatis.apache.org
> >>> Subject: Retrieve inserted id in mass insert using SqlMapExecutor.
> >>>
> >>>
> >>> Hello,
> >>>
> >>> My environtment is:
> >>>
> >>> Java 1.6
> >>> iBatis 2.3.4
> >>> Spring 2.5.6
> >>> MySQL
> >>>
> >>>
> >>> I've a method to create records massively (I write directly, it can has
> >>> sintax errors; just take the idea):
> >>>
> >>> public List<T> createRecordsMassively(final List<T> records) {
> >>>
> >>>         getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
> >>>
> >>>             public Object doInSqlMapClient(SqlMapExecutor executor)
> >>> throws
> >>> SQLException {
> >>>                 executor.startBatch();
> >>>
> >>>             for (T record : records) {
> >>>                     executor.insert("insertRecord", record);
> >>>             }
> >>>
> >>>             //List<BatchResult> result =
> executor.executeBatchDetailed();
> >>>                 int rowsAffected = executor.executeBatch();
> >>>                 return new Integer(rowsAffected);
> >>>             }
> >>>         });
> >>>
> >>>     /*Deal with result*/
> >>>
> >>> }
> >>>
> >>> It works well. The problem is: I want to know which records are
> >>> correctly
> >>> inserted and which aren't. I need the Id in order to execute some logic
> >>> with
> >>> each inserted record. ¿What's the way? ¿How can I retrieve the id of
> the
> >>> inserted records?
> >>>
> >>>
> >>> Thanks in advance,
> >>>
> >>> Westhveg
> >>> --
> >>> View this message in context:
> >>>
> http://www.nabble.com/Retrieve-inserted-id-in-mass-insert-using-SqlMapExecutor.-tp24406261p24406261.html
> >>> Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> >>> For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >>>
> >>>
> >>> Checked by AVG - www.avg.com
> >>> Version: 8.5.375 / Virus Database: 270.13.8/2223 - Release Date:
> >>> 07/08/09
> >>> 21:51:00
> >>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> >>> For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >>>
> >>>
> >>>
> >>
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/Retrieve-inserted-id-in-mass-insert-using-SqlMapExecutor.-tp24406261p24407224.html
> >> Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> >> For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >>
> >>
> >> Checked by AVG - www.avg.com
> >> Version: 8.5.375 / Virus Database: 270.13.8/2223 - Release Date:
> 07/08/09
> >> 21:51:00
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> >> For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >>
> >>
> >>
> >
> > --
> > View this message in context:
> >
> http://www.nabble.com/Retrieve-inserted-id-in-mass-insert-using-SqlMapExecutor.-tp24406261p24409209.html
> > Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> > For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >
> >
> > Checked by AVG - www.avg.com
> > Version: 8.5.375 / Virus Database: 270.13.8/2223 - Release Date: 07/08/09
> > 21:51:00
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> > For additional commands, e-mail: user-java-h...@ibatis.apache.org
> >
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/Retrieve-inserted-id-in-mass-insert-using-SqlMapExecutor.-tp24406261p24410041.html
> Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> For additional commands, e-mail: user-java-h...@ibatis.apache.org
>
>

Reply via email to