This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 3451da78b8c05afc64c65bf6302e5405e918f349 Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Fri Mar 6 17:12:27 2020 +0300 CAY-2650 Support using generated primary keys along with batch inserts cleanup --- .../apache/cayenne/access/OperationObserver.java | 14 +++++++++-- .../apache/cayenne/access/jdbc/BatchAction.java | 28 ++++++++++++---------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java index d24ba90..9553831 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/OperationObserver.java @@ -19,6 +19,7 @@ package org.apache.cayenne.access; +import java.util.Collections; import java.util.List; import org.apache.cayenne.ObjectId; @@ -58,10 +59,19 @@ public interface OperationObserver extends OperationHints { void nextRows(Query q, ResultIterator<?> it); /** - * Callback method invoked after each batch of generated values is read during an - * update. + * Callback method invoked after each batch of generated values is read during an update. * * @since 4.0 + * @deprecated since 4.2, use {@link #nextGeneratedRows(Query, ResultIterator, List)} + */ + @Deprecated + default void nextGeneratedRows(Query query, ResultIterator<?> keys, ObjectId idToUpdate) { + nextGeneratedRows(query, keys, Collections.singletonList(idToUpdate)); + } + + /** + * Callback method invoked after each batch of generated values is read during an update. + * @since 4.2 */ void nextGeneratedRows(Query query, ResultIterator<?> keys, List<ObjectId> idsToUpdate); diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java index e8ba334..d3a92d7 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java @@ -19,6 +19,7 @@ package org.apache.cayenne.access.jdbc; +import org.apache.cayenne.ObjectId; import org.apache.cayenne.ResultIterator; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.access.OperationObserver; @@ -30,7 +31,6 @@ import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.TypesMapping; import org.apache.cayenne.log.JdbcEventLogger; import org.apache.cayenne.map.DbAttribute; -import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.query.BatchQuery; import org.apache.cayenne.query.BatchQueryRow; import org.apache.cayenne.query.InsertBatchQuery; @@ -38,14 +38,12 @@ import org.apache.cayenne.query.InsertBatchQuery; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.function.Consumer; -import java.util.stream.Collectors; /** * @since 1.2 @@ -117,7 +115,7 @@ public class BatchAction extends BaseSQLAction { DbAdapter adapter = dataNode.getAdapter(); - try (PreparedStatement statement = con.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) { + try (PreparedStatement statement = prepareStatement(con, sql, adapter, generatesKeys)) { for (BatchQueryRow row : query.getRows()) { DbAttributeBinding[] bindings = translator.updateBindings(row); @@ -206,10 +204,9 @@ public class BatchAction extends BaseSQLAction { protected boolean supportsGeneratedKeys(boolean isBatch) { // see if we are configured to support generated keys - boolean isSupported = isBatch - ? dataNode.getAdapter().supportsGeneratedKeysForBatchInserts() + return isBatch + ? dataNode.getAdapter().supportsGeneratedKeysForBatchInserts() : dataNode.getAdapter().supportsGeneratedKeys(); - return isSupported; } /** @@ -274,8 +271,11 @@ public class BatchAction extends BaseSQLAction { this.keyRowDescriptor = builder.getDescriptor(dataNode.getAdapter().getExtendedTypes()); } - RowReader<?> rowReader = dataNode.rowReader(keyRowDescriptor, query.getMetaData(dataNode.getEntityResolver()), - Collections.<ObjAttribute, ColumnDescriptor> emptyMap()); + RowReader<?> rowReader = dataNode.rowReader( + keyRowDescriptor, + query.getMetaData(dataNode.getEntityResolver()), + Collections.emptyMap() + ); ResultIterator iterator = new JDBCResultIterator(null, keysRS, rowReader); observer.nextGeneratedRows(query, iterator, Collections.singletonList(row.getObjectId())); @@ -321,9 +321,13 @@ public class BatchAction extends BaseSQLAction { } RowReader<?> rowReader = dataNode.rowReader(keyRowDescriptor, query.getMetaData(dataNode.getEntityResolver()), - Collections.<ObjAttribute, ColumnDescriptor> emptyMap()); + Collections.emptyMap()); ResultIterator iterator = new JDBCResultIterator(null, keysRS, rowReader); - observer.nextGeneratedRows(query, iterator, rows.stream().map(r -> r.getObjectId()).collect(Collectors.toList())); + List<ObjectId> objectIds = new ArrayList<>(rows.size()); + for(BatchQueryRow row : rows) { + objectIds.add(row.getObjectId()); + } + observer.nextGeneratedRows(query, iterator, objectIds); } }