Skip to content

Commit 370e08f

Browse files
committed
When database does not support batch updates, must retrieve generated keys with every serial update.
1 parent 6ac2bcf commit 370e08f

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/BatchJdbcOperations.java

+17-20
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ int[] batchUpdate(String sql, SqlParameterSource[] batchArgs, KeyHolder generate
8585
* @see org.springframework.jdbc.support.GeneratedKeyHolder
8686
* @since 2.4
8787
*/
88-
public int[] batchUpdate(String sql, SqlParameterSource[] batchArgs, KeyHolder generatedKeyHolder,
88+
int[] batchUpdate(String sql, SqlParameterSource[] batchArgs, KeyHolder generatedKeyHolder,
8989
@Nullable String[] keyColumnNames) {
9090

9191
if (batchArgs.length == 0) {
@@ -118,22 +118,23 @@ public int getBatchSize() {
118118
};
119119
PreparedStatementCallback<int[]> preparedStatementCallback = ps -> {
120120
int batchSize = bpss.getBatchSize();
121+
generatedKeyHolder.getKeyList().clear();
121122
if (JdbcUtils.supportsBatchUpdates(ps.getConnection())) {
122123
for (int i = 0; i < batchSize; i++) {
123124
bpss.setValues(ps, i);
124125
ps.addBatch();
125126
}
126127
int[] results = ps.executeBatch();
127-
storeGeneratedKeys(generatedKeyHolder).doInPreparedStatement(ps);
128+
storeGeneratedKeys(generatedKeyHolder, ps);
128129
return results;
129130
} else {
130131
List<Integer> rowsAffected = new ArrayList<>();
131132
for (int i = 0; i < batchSize; i++) {
132133
bpss.setValues(ps, i);
133134
rowsAffected.add(ps.executeUpdate());
135+
storeGeneratedKeys(generatedKeyHolder, ps);
134136
}
135137
int[] rowsAffectedArray = new int[rowsAffected.size()];
136-
storeGeneratedKeys(generatedKeyHolder).doInPreparedStatement(ps);
137138
for (int i = 0; i < rowsAffectedArray.length; i++) {
138139
rowsAffectedArray[i] = rowsAffected.get(i);
139140
}
@@ -145,24 +146,20 @@ public int getBatchSize() {
145146
return result;
146147
}
147148

148-
private PreparedStatementCallback<Void> storeGeneratedKeys(KeyHolder generatedKeyHolder) {
149+
private void storeGeneratedKeys(KeyHolder generatedKeyHolder, PreparedStatement ps) throws SQLException {
149150

150-
return ps -> {
151-
List<Map<String, Object>> generatedKeys = generatedKeyHolder.getKeyList();
152-
generatedKeys.clear();
153-
ResultSet keys = ps.getGeneratedKeys();
154-
if (keys != null) {
155-
try {
156-
RowMapperResultSetExtractor<Map<String, Object>> rse =
157-
new RowMapperResultSetExtractor<>(new ColumnMapRowMapper(), 1);
158-
//noinspection ConstantConditions
159-
generatedKeys.addAll(rse.extractData(keys));
160-
}
161-
finally {
162-
JdbcUtils.closeResultSet(keys);
163-
}
151+
List<Map<String, Object>> generatedKeys = generatedKeyHolder.getKeyList();
152+
ResultSet keys = ps.getGeneratedKeys();
153+
if (keys != null) {
154+
try {
155+
RowMapperResultSetExtractor<Map<String, Object>> rse =
156+
new RowMapperResultSetExtractor<>(new ColumnMapRowMapper(), 1);
157+
//noinspection ConstantConditions
158+
generatedKeys.addAll(rse.extractData(keys));
164159
}
165-
return null;
166-
};
160+
finally {
161+
JdbcUtils.closeResultSet(keys);
162+
}
163+
}
167164
}
168165
}

0 commit comments

Comments
 (0)