Skip to content

Commit 8332465

Browse files
committed
Removed is new check from id generation by sequence.
The check prevented the id generation when there was a version property, since that was already set at the time of the check and therefore the check failed. Closes #2199
1 parent e3497b0 commit 8332465

9 files changed

+239
-33
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public Object onBeforeSave(Object aggregate, MutableAggregateChange<Object> aggr
5959
RelationalPersistentProperty property = entity.getRequiredIdProperty();
6060
PersistentPropertyAccessor<Object> accessor = entity.getPropertyAccessor(aggregate);
6161

62-
if (!entity.isNew(aggregate) || delegate.hasValue(property, accessor) || !property.hasSequence()) {
62+
if (delegate.hasValue(property, accessor) || !property.hasSequence()) {
6363
return aggregate;
6464
}
6565

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class JdbcRepositoryIdGenerationIntegrationTests {
6969
@Autowired SimpleSeqRepository simpleSeqRepository;
7070
@Autowired PersistableSeqRepository persistableSeqRepository;
7171
@Autowired PrimitiveIdSeqRepository primitiveIdSeqRepository;
72+
@Autowired PrimitiveIdSeqWithVersionRepository primitiveIdSeqWithVersionRepository;
7273
@Autowired IdGeneratingEntityCallback idGeneratingCallback;
7374

7475
@Test // DATAJDBC-98
@@ -173,6 +174,22 @@ void testInsertAggregateWithSequenceAndUnsetPrimitiveId() {
173174
assertThat(saved.id).isEqualTo(1L); // sequence starts with 1
174175
}
175176

177+
@Test // DATAJDBC-2199
178+
@EnabledOnFeature(TestDatabaseFeatures.Feature.SUPPORTS_SEQUENCES)
179+
void testInsertAggregateWithSequenceAndVersionField() {
180+
181+
IdSeqWithVersion entity = new IdSeqWithVersion();
182+
entity.name = "some name";
183+
CompletableFuture<IdSeqWithVersion> afterCallback = mockIdGeneratingCallback(entity);
184+
185+
IdSeqWithVersion saved = primitiveIdSeqWithVersionRepository.save(entity);
186+
187+
// 1. Select from sequence
188+
// 2. Actual INSERT
189+
assertThat(afterCallback.join().id).isEqualTo(1L);
190+
assertThat(saved.id).isEqualTo(1L); // sequence starts with 1
191+
}
192+
176193
@SuppressWarnings("unchecked")
177194
private <T> CompletableFuture<T> mockIdGeneratingCallback(T entity) {
178195

@@ -198,6 +215,8 @@ interface PersistableSeqRepository extends ListCrudRepository<PersistableSeq, Lo
198215

199216
interface PrimitiveIdSeqRepository extends ListCrudRepository<PrimitiveIdSeq, Long> {}
200217

218+
interface PrimitiveIdSeqWithVersionRepository extends ListCrudRepository<IdSeqWithVersion, Long> {}
219+
201220
record ReadOnlyIdEntity(@Id Long id, String name) {
202221
}
203222

@@ -251,6 +270,15 @@ static class PrimitiveIdSeq {
251270

252271
}
253272

273+
static class IdSeqWithVersion {
274+
275+
@Id
276+
@Sequence(value = "seq_with_version_seq") private long id;
277+
278+
private String name;
279+
private Long version;
280+
}
281+
254282
static class PrimitiveIdEntity {
255283

256284
@Id private long id;

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-db2.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ DROP TABLE PersistableSeq;
99
DROP SEQUENCE persistable_seq_seq;
1010
DROP TABLE PrimitiveIdSeq;
1111
DROP SEQUENCE "primitive_seq_seq";
12+
DROP TABLE IdSeqWithVersion;
13+
DROP SEQUENCE "seq_with_version_seq";
1214

1315
CREATE TABLE ReadOnlyIdEntity
1416
(
@@ -43,3 +45,10 @@ CREATE TABLE PrimitiveIdSeq
4345
NAME VARCHAR(100)
4446
);
4547
CREATE SEQUENCE "primitive_seq_seq" START WITH 1;
48+
CREATE TABLE IdSeqWithVersion
49+
(
50+
ID BIGINT NOT NULL PRIMARY KEY,
51+
NAME VARCHAR(100),
52+
VERSION BIGINT
53+
);
54+
CREATE SEQUENCE "seq_with_version_seq" START WITH 1;
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,43 @@
11
-- noinspection SqlNoDataSourceInspectionForFile
22

3-
CREATE TABLE ReadOnlyIdEntity (ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, NAME VARCHAR(100));
4-
CREATE TABLE PrimitiveIdEntity (ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, NAME VARCHAR(100));
5-
CREATE TABLE ImmutableWithManualIdentity (ID BIGINT PRIMARY KEY, NAME VARCHAR(100));
3+
CREATE TABLE ReadOnlyIdEntity
4+
(
5+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
6+
NAME VARCHAR(100)
7+
);
8+
CREATE TABLE PrimitiveIdEntity
9+
(
10+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
11+
NAME VARCHAR(100)
12+
);
13+
CREATE TABLE ImmutableWithManualIdentity
14+
(
15+
ID BIGINT PRIMARY KEY,
16+
NAME VARCHAR(100)
17+
);
618

7-
CREATE TABLE SimpleSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
19+
CREATE TABLE SimpleSeq
20+
(
21+
ID BIGINT NOT NULL PRIMARY KEY,
22+
NAME VARCHAR(100)
23+
);
824
CREATE SEQUENCE simple_seq_seq START WITH 1;
9-
CREATE TABLE PersistableSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
25+
CREATE TABLE PersistableSeq
26+
(
27+
ID BIGINT NOT NULL PRIMARY KEY,
28+
NAME VARCHAR(100)
29+
);
1030
CREATE SEQUENCE persistable_seq_seq START WITH 1;
11-
CREATE TABLE PrimitiveIdSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
31+
CREATE TABLE PrimitiveIdSeq
32+
(
33+
ID BIGINT NOT NULL PRIMARY KEY,
34+
NAME VARCHAR(100)
35+
);
1236
CREATE SEQUENCE "primitive_seq_seq" START WITH 1;
37+
CREATE TABLE IdSeqWithVersion
38+
(
39+
ID BIGINT NOT NULL PRIMARY KEY,
40+
NAME VARCHAR(100),
41+
VERSION BIGINT
42+
);
43+
CREATE SEQUENCE "seq_with_version_seq" START WITH 1;
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,43 @@
11
-- noinspection SqlNoDataSourceInspectionForFile
22

3-
CREATE TABLE ReadOnlyIdEntity (ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, NAME VARCHAR(100));
4-
CREATE TABLE PrimitiveIdEntity (ID BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, NAME VARCHAR(100));
5-
CREATE TABLE ImmutableWithManualIdentity (ID BIGINT PRIMARY KEY, NAME VARCHAR(100));
3+
CREATE TABLE ReadOnlyIdEntity
4+
(
5+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
6+
NAME VARCHAR(100)
7+
);
8+
CREATE TABLE PrimitiveIdEntity
9+
(
10+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
11+
NAME VARCHAR(100)
12+
);
13+
CREATE TABLE ImmutableWithManualIdentity
14+
(
15+
ID BIGINT PRIMARY KEY,
16+
NAME VARCHAR(100)
17+
);
618

7-
CREATE TABLE SimpleSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
19+
CREATE TABLE SimpleSeq
20+
(
21+
ID BIGINT NOT NULL PRIMARY KEY,
22+
NAME VARCHAR(100)
23+
);
824
CREATE SEQUENCE "simple_seq_seq" START WITH 1;
9-
CREATE TABLE PersistableSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
25+
CREATE TABLE PersistableSeq
26+
(
27+
ID BIGINT NOT NULL PRIMARY KEY,
28+
NAME VARCHAR(100)
29+
);
1030
CREATE SEQUENCE "persistable_seq_seq" START WITH 1;
11-
CREATE TABLE PrimitiveIdSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
31+
CREATE TABLE PrimitiveIdSeq
32+
(
33+
ID BIGINT NOT NULL PRIMARY KEY,
34+
NAME VARCHAR(100)
35+
);
1236
CREATE SEQUENCE "primitive_seq_seq" START WITH 1;
37+
CREATE TABLE IdSeqWithVersion
38+
(
39+
ID BIGINT NOT NULL PRIMARY KEY,
40+
NAME VARCHAR(100),
41+
VERSION BIGINT
42+
);
43+
CREATE SEQUENCE "seq_with_version_seq" START WITH 1;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,40 @@
1-
CREATE TABLE ReadOnlyIdEntity (ID BIGINT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(100));
2-
CREATE TABLE PrimitiveIdEntity (ID BIGINT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(100));
3-
CREATE TABLE ImmutableWithManualIdentity (ID BIGINT PRIMARY KEY, NAME VARCHAR(100));
4-
CREATE TABLE SimpleSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
1+
CREATE TABLE ReadOnlyIdEntity
2+
(
3+
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
4+
NAME VARCHAR(100)
5+
);
6+
CREATE TABLE PrimitiveIdEntity
7+
(
8+
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
9+
NAME VARCHAR(100)
10+
);
11+
CREATE TABLE ImmutableWithManualIdentity
12+
(
13+
ID BIGINT PRIMARY KEY,
14+
NAME VARCHAR(100)
15+
);
16+
CREATE TABLE SimpleSeq
17+
(
18+
ID BIGINT NOT NULL PRIMARY KEY,
19+
NAME VARCHAR(100)
20+
);
521
CREATE SEQUENCE simple_seq_seq START WITH 1;
6-
CREATE TABLE PersistableSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
22+
CREATE TABLE PersistableSeq
23+
(
24+
ID BIGINT NOT NULL PRIMARY KEY,
25+
NAME VARCHAR(100)
26+
);
727
CREATE SEQUENCE persistable_seq_seq START WITH 1;
8-
CREATE TABLE PrimitiveIdSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
28+
CREATE TABLE PrimitiveIdSeq
29+
(
30+
ID BIGINT NOT NULL PRIMARY KEY,
31+
NAME VARCHAR(100)
32+
);
933
CREATE SEQUENCE primitive_seq_seq START WITH 1;
34+
CREATE TABLE IdSeqWithVersion
35+
(
36+
ID BIGINT NOT NULL PRIMARY KEY,
37+
NAME VARCHAR(100),
38+
VERSION BIGINT
39+
);
40+
CREATE SEQUENCE seq_with_version_seq START WITH 1;

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-mssql.sql

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,48 @@ DROP SEQUENCE IF EXISTS persistable_seq_seq;
99
DROP TABLE IF EXISTS PrimitiveIdSeq;
1010
DROP SEQUENCE IF EXISTS primitive_seq_seq;
1111

12-
CREATE TABLE ReadOnlyIdEntity (ID BIGINT IDENTITY PRIMARY KEY, NAME VARCHAR(100));
13-
CREATE TABLE PrimitiveIdEntity (ID BIGINT IDENTITY PRIMARY KEY, NAME VARCHAR(100));
14-
CREATE TABLE ImmutableWithManualIdentity (ID BIGINT PRIMARY KEY, NAME VARCHAR(100));
15-
CREATE TABLE EntityWithSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
16-
CREATE TABLE SimpleSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
12+
CREATE TABLE ReadOnlyIdEntity
13+
(
14+
ID BIGINT IDENTITY PRIMARY KEY,
15+
NAME VARCHAR(100)
16+
);
17+
CREATE TABLE PrimitiveIdEntity
18+
(
19+
ID BIGINT IDENTITY PRIMARY KEY,
20+
NAME VARCHAR(100)
21+
);
22+
CREATE TABLE ImmutableWithManualIdentity
23+
(
24+
ID BIGINT PRIMARY KEY,
25+
NAME VARCHAR(100)
26+
);
27+
CREATE TABLE EntityWithSeq
28+
(
29+
ID BIGINT NOT NULL PRIMARY KEY,
30+
NAME VARCHAR(100)
31+
);
32+
CREATE TABLE SimpleSeq
33+
(
34+
ID BIGINT NOT NULL PRIMARY KEY,
35+
NAME VARCHAR(100)
36+
);
1737
CREATE SEQUENCE simple_seq_seq START WITH 1;
18-
CREATE TABLE PersistableSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
38+
CREATE TABLE PersistableSeq
39+
(
40+
ID BIGINT NOT NULL PRIMARY KEY,
41+
NAME VARCHAR(100)
42+
);
1943
CREATE SEQUENCE persistable_seq_seq START WITH 1;
20-
CREATE TABLE PrimitiveIdSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
44+
CREATE TABLE PrimitiveIdSeq
45+
(
46+
ID BIGINT NOT NULL PRIMARY KEY,
47+
NAME VARCHAR(100)
48+
);
2149
CREATE SEQUENCE primitive_seq_seq START WITH 1;
50+
CREATE TABLE IdSeqWithVersion
51+
(
52+
ID BIGINT NOT NULL PRIMARY KEY,
53+
NAME VARCHAR(100),
54+
VERSION BIGINT
55+
);
56+
CREATE SEQUENCE seq_with_version_seq START WITH 1;

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-oracle.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ DROP TABLE PersistableSeq;
88
DROP SEQUENCE persistable_seq_seq;
99
DROP TABLE PrimitiveIdSeq;
1010
DROP SEQUENCE "primitive_seq_seq";
11+
DROP TABLE IdSeqWithVersion;
12+
DROP SEQUENCE "seq_with_version_seq";
1113

1214
CREATE TABLE ReadOnlyIdEntity (
1315
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
@@ -44,3 +46,11 @@ CREATE TABLE PrimitiveIdSeq (
4446
);
4547

4648
CREATE SEQUENCE "primitive_seq_seq" START WITH 1;
49+
50+
CREATE TABLE IdSeqWithVersion (
51+
ID NUMBER PRIMARY KEY,
52+
NAME VARCHAR2(100),
53+
VERSION NUMBER
54+
);
55+
56+
CREATE SEQUENCE "seq_with_version_seq" START WITH 1;

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.repository/JdbcRepositoryIdGenerationIntegrationTests-postgres.sql

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,43 @@ DROP TABLE EntityWithSeq;
55
DROP TABLE PersistableEntityWithSeq;
66
DROP TABLE PrimitiveIdEntityWithSeq;
77

8-
CREATE TABLE ReadOnlyIdEntity (ID SERIAL PRIMARY KEY, NAME VARCHAR(100));
9-
CREATE TABLE PrimitiveIdEntity (ID SERIAL PRIMARY KEY, NAME VARCHAR(100));
10-
CREATE TABLE ImmutableWithManualIdentity (ID BIGINT PRIMARY KEY, NAME VARCHAR(100));
11-
CREATE TABLE SimpleSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
8+
CREATE TABLE ReadOnlyIdEntity
9+
(
10+
ID SERIAL PRIMARY KEY,
11+
NAME VARCHAR(100)
12+
);
13+
CREATE TABLE PrimitiveIdEntity
14+
(
15+
ID SERIAL PRIMARY KEY,
16+
NAME VARCHAR(100)
17+
);
18+
CREATE TABLE ImmutableWithManualIdentity
19+
(
20+
ID BIGINT PRIMARY KEY,
21+
NAME VARCHAR(100)
22+
);
23+
CREATE TABLE SimpleSeq
24+
(
25+
ID BIGINT NOT NULL PRIMARY KEY,
26+
NAME VARCHAR(100)
27+
);
1228
CREATE SEQUENCE simple_seq_seq START WITH 1;
13-
CREATE TABLE PersistableSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
29+
CREATE TABLE PersistableSeq
30+
(
31+
ID BIGINT NOT NULL PRIMARY KEY,
32+
NAME VARCHAR(100)
33+
);
1434
CREATE SEQUENCE persistable_seq_seq START WITH 1;
15-
CREATE TABLE PrimitiveIdSeq (ID BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR(100));
16-
CREATE SEQUENCE primitive_seq_seq START WITH 1;
35+
CREATE TABLE PrimitiveIdSeq
36+
(
37+
ID BIGINT NOT NULL PRIMARY KEY,
38+
NAME VARCHAR(100)
39+
);
40+
CREATE SEQUENCE primitive_seq_seq START WITH 1;
41+
CREATE TABLE IdSeqWithVersion
42+
(
43+
ID BIGINT NOT NULL PRIMARY KEY,
44+
NAME VARCHAR(100),
45+
VERSION BIGINT
46+
);
47+
CREATE SEQUENCE seq_with_version_seq START WITH 1;

0 commit comments

Comments
 (0)