Skip to content

Commit 748c5ba

Browse files
gzsombormp911de
authored andcommitted
#390 - Insert should work without giving any explicit assignment/variables.
DatabaseClient.insert() can now persist objects that consist only of an id.
1 parent 7b676a9 commit 748c5ba

File tree

5 files changed

+51
-10
lines changed

5 files changed

+51
-10
lines changed

src/main/java/org/springframework/data/r2dbc/core/DefaultDatabaseClient.java

-4
Original file line numberDiff line numberDiff line change
@@ -1044,10 +1044,6 @@ public Mono<Void> then() {
10441044

10451045
private <R> FetchSpec<R> exchange(BiFunction<Row, RowMetadata, R> mappingFunction) {
10461046

1047-
if (this.byName.isEmpty()) {
1048-
throw new IllegalStateException("Insert fields is empty!");
1049-
}
1050-
10511047
StatementMapper mapper = dataAccessStrategy.getStatementMapper();
10521048
StatementMapper.InsertSpec insert = mapper.createInsert(this.table);
10531049

src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java

-4
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,6 @@ private PreparedOperation<Insert> getMappedObject(InsertSpec insertSpec,
159159

160160
Bindings bindings;
161161

162-
if (boundAssignments.getAssignments().isEmpty()) {
163-
throw new IllegalStateException("INSERT contains no values");
164-
}
165-
166162
bindings = boundAssignments.getBindings();
167163

168164
InsertBuilder.InsertIntoColumnsAndValues insertBuilder = StatementBuilder.insert(table);

src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java

+16
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,22 @@ public void insertShouldAcceptSettableValue() {
249249
verify(statement).bindNull(1, Integer.class);
250250
}
251251

252+
@Test
253+
public void insertShouldWorkWithoutValues() {
254+
255+
Statement statement = mockStatementFor("INSERT INTO id_only VALUES ()");
256+
DatabaseClient databaseClient = databaseClientBuilder.build();
257+
258+
databaseClient.insert().into("id_only") //
259+
.then() //
260+
.as(StepVerifier::create) //
261+
.verifyComplete();
262+
263+
verify(statement).returnGeneratedValues();
264+
verify(statement).execute();
265+
verifyNoMoreInteractions(statement);
266+
}
267+
252268
@Test // gh-128
253269
public void executeShouldBindNamedValuesByIndex() {
254270

src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg
6161

6262
@Autowired private LegoSetRepository repository;
6363
@Autowired private ConnectionFactory connectionFactory;
64-
private JdbcTemplate jdbc;
64+
protected JdbcTemplate jdbc;
6565

6666
@Before
6767
public void before() {

src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,33 @@
1616
package org.springframework.data.r2dbc.repository;
1717

1818
import io.r2dbc.spi.ConnectionFactory;
19+
import lombok.Getter;
20+
import lombok.NoArgsConstructor;
21+
import lombok.Setter;
1922
import reactor.core.publisher.Flux;
2023
import reactor.core.publisher.Mono;
2124
import reactor.test.StepVerifier;
2225

26+
import java.util.Arrays;
27+
2328
import javax.sql.DataSource;
2429

2530
import org.junit.Test;
2631
import org.junit.runner.RunWith;
32+
import static org.assertj.core.api.Assertions.*;
2733

2834
import org.springframework.beans.factory.annotation.Autowired;
2935
import org.springframework.context.annotation.Bean;
3036
import org.springframework.context.annotation.ComponentScan.Filter;
3137
import org.springframework.context.annotation.Configuration;
3238
import org.springframework.context.annotation.FilterType;
39+
import org.springframework.data.annotation.Id;
3340
import org.springframework.data.r2dbc.config.AbstractR2dbcConfiguration;
3441
import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories;
3542
import org.springframework.data.r2dbc.repository.support.R2dbcRepositoryFactory;
3643
import org.springframework.data.r2dbc.testing.H2TestSupport;
44+
import org.springframework.data.relational.core.mapping.Table;
45+
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
3746
import org.springframework.test.context.ContextConfiguration;
3847
import org.springframework.test.context.junit4.SpringRunner;
3948

@@ -47,10 +56,11 @@
4756
public class H2R2dbcRepositoryIntegrationTests extends AbstractR2dbcRepositoryIntegrationTests {
4857

4958
@Autowired private H2LegoSetRepository repository;
59+
@Autowired private IdOnlyEntityRepository idOnlyEntityRepository;
5060

5161
@Configuration
5262
@EnableR2dbcRepositories(considerNestedRepositories = true,
53-
includeFilters = @Filter(classes = H2LegoSetRepository.class, type = FilterType.ASSIGNABLE_TYPE))
63+
includeFilters = @Filter(classes = {H2LegoSetRepository.class, IdOnlyEntityRepository.class}, type = FilterType.ASSIGNABLE_TYPE))
5464
static class IntegrationTestConfiguration extends AbstractR2dbcConfiguration {
5565

5666
@Bean
@@ -60,6 +70,17 @@ public ConnectionFactory connectionFactory() {
6070
}
6171
}
6272

73+
interface IdOnlyEntityRepository extends ReactiveCrudRepository<IdOnlyEntity, Integer> {
74+
}
75+
76+
@Getter
77+
@Setter
78+
@Table("id_only")
79+
@NoArgsConstructor
80+
static class IdOnlyEntity {
81+
@Id Integer id;
82+
}
83+
6384
@Override
6485
protected DataSource createDataSource() {
6586
return H2TestSupport.createDataSource();
@@ -112,6 +133,18 @@ public void shouldNotReturnUpdateCount() {
112133
repository.updateManualAndReturnNothing(42).as(StepVerifier::create).verifyComplete();
113134
}
114135

136+
@Test
137+
public void shouldInsertIdOnlyEntity() {
138+
this.jdbc.execute("CREATE TABLE ID_ONLY(id serial CONSTRAINT id_only_pk PRIMARY KEY)");
139+
140+
IdOnlyEntity entity1 = new IdOnlyEntity();
141+
idOnlyEntityRepository.saveAll(Arrays.asList(entity1))
142+
.as(StepVerifier::create) //
143+
.consumeNextWith( actual -> {
144+
assertThat(actual.getId()).isNotNull();
145+
}).verifyComplete();
146+
}
147+
115148
interface H2LegoSetRepository extends LegoSetRepository {
116149

117150
@Override

0 commit comments

Comments
 (0)