5858 * @author Mark Paluch
5959 * @author Myeonghyeon Lee
6060 * @author Myat Min
61+ * @author Radim Tlusty
6162 */
6263public class DefaultDataAccessStrategyUnitTests {
6364
6465 public static final long ID_FROM_ADDITIONAL_VALUES = 23L ;
6566 public static final long ORIGINAL_ID = 4711L ;
67+ public static final long GENERATED_ID = 17 ;
6668
6769 NamedParameterJdbcOperations namedJdbcOperations = mock (NamedParameterJdbcOperations .class );
6870 JdbcOperations jdbcOperations = mock (JdbcOperations .class );
@@ -99,7 +101,7 @@ public void additionalParameterForIdDoesNotLeadToDuplicateParameters() {
99101 accessStrategy .insert (new DummyEntity (ORIGINAL_ID ), DummyEntity .class , Identifier .from (additionalParameters ));
100102
101103 verify (namedJdbcOperations ).update (eq ("INSERT INTO \" DUMMY_ENTITY\" (\" ID\" ) VALUES (:ID)" ),
102- paramSourceCaptor .capture (), any ( KeyHolder . class ) );
104+ paramSourceCaptor .capture ());
103105 }
104106
105107 @ Test // DATAJDBC-146
@@ -111,7 +113,7 @@ public void additionalParametersGetAddedToStatement() {
111113
112114 accessStrategy .insert (new DummyEntity (ORIGINAL_ID ), DummyEntity .class , Identifier .from (additionalParameters ));
113115
114- verify (namedJdbcOperations ).update (sqlCaptor .capture (), paramSourceCaptor .capture (), any ( KeyHolder . class ) );
116+ verify (namedJdbcOperations ).update (sqlCaptor .capture (), paramSourceCaptor .capture ());
115117
116118 assertThat (sqlCaptor .getValue ()) //
117119 .containsSubsequence ("INSERT INTO \" DUMMY_ENTITY\" (" , "\" ID\" " , ") VALUES (" , ":id" , ")" ) //
@@ -131,7 +133,7 @@ public void considersConfiguredWriteConverter() {
131133
132134 accessStrategy .insert (entity , EntityWithBoolean .class , Identifier .empty ());
133135
134- verify (namedJdbcOperations ).update (sqlCaptor .capture (), paramSourceCaptor .capture (), any ( KeyHolder . class ) );
136+ verify (namedJdbcOperations ).update (sqlCaptor .capture (), paramSourceCaptor .capture ());
135137
136138 assertThat (paramSourceCaptor .getValue ().getValue ("id" )).isEqualTo (ORIGINAL_ID );
137139 assertThat (paramSourceCaptor .getValue ().getValue ("flag" )).isEqualTo ("T" );
@@ -150,7 +152,7 @@ public void considersConfiguredWriteConverterForIdValueObjects() {
150152
151153 accessStrategy .insert (entity , WithValueObjectId .class , Identifier .empty ());
152154
153- verify (namedJdbcOperations ).update (anyString (), paramSourceCaptor .capture (), any ( KeyHolder . class ) );
155+ verify (namedJdbcOperations ).update (anyString (), paramSourceCaptor .capture ());
154156
155157 assertThat (paramSourceCaptor .getValue ().getValue ("id" )).isEqualTo (rawId );
156158 assertThat (paramSourceCaptor .getValue ().getValue ("value" )).isEqualTo ("vs. superman" );
@@ -177,7 +179,7 @@ public void considersConfiguredWriteConverterForIdValueObjectsWhichReferencedInO
177179 additionalParameters .put (SqlIdentifier .quoted ("DUMMYENTITYROOT" ), rootIdValue );
178180 accessStrategy .insert (root , DummyEntityRoot .class , Identifier .from (additionalParameters ));
179181
180- verify (namedJdbcOperations ).update (anyString (), paramSourceCaptor .capture (), any ( KeyHolder . class ) );
182+ verify (namedJdbcOperations ).update (anyString (), paramSourceCaptor .capture ());
181183
182184 assertThat (paramSourceCaptor .getValue ().getValue ("id" )).isEqualTo (rawId );
183185
@@ -191,6 +193,36 @@ public void considersConfiguredWriteConverterForIdValueObjectsWhichReferencedInO
191193 assertThat (paramSourceCaptor .getValue ().getValue ("DUMMYENTITYROOT" )).isEqualTo (rawId );
192194 }
193195
196+ @ Test // gh-933
197+ public void insertWithDefinedIdDoesNotRetrieveGeneratedKeys () {
198+
199+ Object generatedId = accessStrategy .insert (new DummyEntity (ORIGINAL_ID ), DummyEntity .class , Identifier .from (additionalParameters ));
200+
201+ assertThat (generatedId ).isNull ();
202+
203+ verify (namedJdbcOperations ).update (eq ("INSERT INTO \" DUMMY_ENTITY\" (\" ID\" ) VALUES (:id)" ),
204+ paramSourceCaptor .capture ());
205+ }
206+
207+ @ Test // gh-933
208+ public void insertWithUndefinedIdRetrievesGeneratedKeys () {
209+
210+ when (namedJdbcOperations .update (any (), any (), any ()))
211+ .then (invocation -> {
212+
213+ KeyHolder keyHolder = invocation .getArgument (2 );
214+ keyHolder .getKeyList ().add (singletonMap ("ID" , GENERATED_ID ));
215+ return 1 ;
216+ });
217+
218+ Object generatedId = accessStrategy .insert (new DummyEntity (null ), DummyEntity .class , Identifier .from (additionalParameters ));
219+
220+ assertThat (generatedId ).isEqualTo (GENERATED_ID );
221+
222+ verify (namedJdbcOperations ).update (eq ("INSERT INTO \" DUMMY_ENTITY\" VALUES ()" ),
223+ paramSourceCaptor .capture (), any (KeyHolder .class ));
224+ }
225+
194226 private DefaultDataAccessStrategy createAccessStrategyWithConverter (List <?> converters ) {
195227 DelegatingDataAccessStrategy relationResolver = new DelegatingDataAccessStrategy ();
196228
0 commit comments