Skip to content

Commit 99be2fa

Browse files
committed
now handles multiple generated keys on insert
1 parent 7dfe902 commit 99be2fa

File tree

10 files changed

+219
-180
lines changed

10 files changed

+219
-180
lines changed

pom.xml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<groupId>com.dieselpoint</groupId>
88
<artifactId>norm</artifactId>
99
<name>Norm</name>
10-
<version>0.8.10</version>
10+
<version>1.0</version>
1111
<packaging>jar</packaging>
1212

1313
<description>An extremely lightweight data access layer over JDBC</description>
@@ -138,34 +138,41 @@
138138
<dependency>
139139
<groupId>com.zaxxer</groupId>
140140
<artifactId>HikariCP</artifactId>
141-
<version>3.4.1</version>
141+
<version>3.4.5</version>
142142
</dependency>
143143

144144
<dependency>
145145
<groupId>mysql</groupId>
146146
<artifactId>mysql-connector-java</artifactId>
147-
<version>8.0.17</version>
147+
<version>8.0.22</version>
148148
<scope>test</scope>
149149
</dependency>
150150

151151
<dependency>
152152
<groupId>org.postgresql</groupId>
153153
<artifactId>postgresql</artifactId>
154-
<version>42.2.8</version>
154+
<version>42.2.18</version>
155155
<scope>test</scope>
156156
</dependency>
157157

158158
<dependency>
159159
<groupId>com.h2database</groupId>
160160
<artifactId>h2</artifactId>
161-
<version>1.4.199</version>
161+
<version>1.4.200</version>
162162
<scope>test</scope>
163163
</dependency>
164164

165165
<dependency>
166166
<groupId>org.xerial</groupId>
167167
<artifactId>sqlite-jdbc</artifactId>
168-
<version>3.28.0</version>
168+
<version>3.32.3.2</version>
169+
<scope>test</scope>
170+
</dependency>
171+
172+
<dependency>
173+
<groupId>org.apache.derby</groupId>
174+
<artifactId>derby</artifactId>
175+
<version>10.15.2.0</version>
169176
<scope>test</scope>
170177
</dependency>
171178

@@ -179,7 +186,7 @@
179186
<dependency>
180187
<groupId>junit</groupId>
181188
<artifactId>junit</artifactId>
182-
<version>4.12</version>
189+
<version>4.13.1</version>
183190
<scope>test</scope>
184191
</dependency>
185192

src/main/java/com/dieselpoint/norm/Query.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.util.Map;
1313

1414
import com.dieselpoint.norm.sqlmakers.PojoInfo;
15-
import com.dieselpoint.norm.sqlmakers.Property;
1615
import com.dieselpoint.norm.sqlmakers.SqlMaker;
1716

1817
/**
@@ -257,10 +256,10 @@ public Query insert(Object row) {
257256

258257
if (this.generatedKeyReceiver == null) {
259258
PojoInfo pojoInfo = sqlMaker.getPojoInfo(row.getClass());
260-
Property prop = pojoInfo.getGeneratedColumnProperty();
261-
if (prop != null) {
259+
String[] names = pojoInfo.getGeneratedColumnNames();
260+
if (names.length != 0) {
262261
this.generatedKeyReceiver = row;
263-
this.generatedKeyNames = new String[] { prop.name };
262+
this.generatedKeyNames = names;
264263
}
265264
}
266265

@@ -402,26 +401,41 @@ private void populateGeneratedKeys(PreparedStatement state, Object generatedKeyR
402401
} else {
403402

404403
for (String generatedKeyName : generatedKeyNames) {
404+
405+
Object value;
406+
if (colCount == 1) {
407+
value = rs.getObject(1);
408+
} else {
409+
value = rs.getObject(generatedKeyName);
410+
}
411+
pojoInfo.putValue(generatedKeyReceiver, generatedKeyName, value);
412+
413+
/*-
414+
415+
405416
Property prop = pojoInfo.getProperty(generatedKeyName);
406417
if (prop == null) {
407418
throw new DbException("Generated key name not found: " + generatedKeyName);
408419
}
409-
420+
410421
/*
411422
* getObject() below doesn't handle primitives correctly. Must convert to object
412423
* equivalent.
413-
*/
414-
424+
* /
425+
415426
Class<?> type = Util.wrap(prop.dataType);
416-
427+
428+
Object colValue = sqlMaker.convertValue(rs.getObject(i), meta.getColumnTypeName(i));
429+
417430
Object newKey;
418431
if (colCount == 1) {
419432
newKey = rs.getObject(1, type);
420433
} else {
421434
newKey = rs.getObject(prop.name, type);
422435
}
423-
436+
424437
pojoInfo.putValue(generatedKeyReceiver, prop.name, newKey);
438+
*/
425439
}
426440
}
427441
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.dieselpoint.norm.sqlmakers;
22

3-
4-
53
public interface PojoInfo {
4+
65
public Object getValue(Object pojo, String name);
6+
77
public void putValue(Object pojo, String name, Object value);
8+
89
public void putValue(Object pojo, String name, Object value, boolean ignoreIfMissing);
9-
public Property getGeneratedColumnProperty();
10+
11+
public String[] getGeneratedColumnNames();
12+
1013
public Property getProperty(String name);
1114

1215
}

src/main/java/com/dieselpoint/norm/sqlmakers/SqlMaker.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,28 @@
22

33
import com.dieselpoint.norm.Query;
44

5-
6-
75
public interface SqlMaker {
8-
6+
97
public String getInsertSql(Query query, Object row);
8+
109
public Object[] getInsertArgs(Query query, Object row);
1110

1211
public String getUpdateSql(Query query, Object row);
12+
1313
public Object[] getUpdateArgs(Query query, Object row);
14-
14+
1515
public String getDeleteSql(Query query, Object row);
16+
1617
public Object[] getDeleteArgs(Query query, Object row);
1718

1819
public String getUpsertSql(Query query, Object row);
20+
1921
public Object[] getUpsertArgs(Query query, Object row);
20-
22+
2123
public String getSelectSql(Query query, Class<?> rowClass);
24+
2225
public String getCreateTableSql(Class<?> clazz);
23-
26+
2427
public PojoInfo getPojoInfo(Class<?> rowClass);
2528

2629
public Object convertValue(Object value, String columnTypeName);

src/main/java/com/dieselpoint/norm/sqlmakers/StandardPojoInfo.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class StandardPojoInfo implements PojoInfo {
4343
public LinkedHashMap<String, Property> propertyMap = new LinkedHashMap<String, Property>();
4444
public String table;
4545
public String primaryKeyName;
46-
public String generatedColumnName;
46+
public String[] generatedColumnNames;
4747

4848
public String insertSql;
4949
public int insertSqlArgCount;
@@ -158,6 +158,16 @@ private List<Property> populateProperties(Class<?> clazz)
158158
props.add(prop);
159159
}
160160

161+
List<String> genCols = new ArrayList<>();
162+
for (Property prop : props) {
163+
if (prop.isGenerated) {
164+
genCols.add(prop.name);
165+
}
166+
}
167+
168+
this.generatedColumnNames = new String[genCols.size()];
169+
genCols.toArray(this.generatedColumnNames);
170+
161171
return props;
162172
}
163173

@@ -185,7 +195,6 @@ private void applyAnnotations(Property prop, AnnotatedElement ae)
185195
}
186196

187197
if (ae.getAnnotation(GeneratedValue.class) != null) {
188-
generatedColumnName = prop.name;
189198
prop.isGenerated = true;
190199
}
191200

@@ -234,10 +243,10 @@ public Object getValue(Object pojo, String name) {
234243
if (value != null) {
235244
if (prop.serializer != null) {
236245
value = prop.serializer.serialize(value);
237-
246+
238247
} else if (prop.converter != null) {
239248
value = prop.converter.convertToDatabaseColumn(value);
240-
249+
241250
} else if (prop.isEnumField) {
242251
// handle enums according to selected enum type
243252
if (prop.enumType == EnumType.ORDINAL) {
@@ -274,7 +283,7 @@ public void putValue(Object pojo, String name, Object value, boolean ignoreIfMis
274283
if (value != null) {
275284
if (prop.serializer != null) {
276285
value = prop.serializer.deserialize((String) value, prop.dataType);
277-
286+
278287
} else if (prop.converter != null) {
279288
value = prop.converter.convertToEntityAttribute(value);
280289

@@ -329,13 +338,13 @@ private <T extends Enum<T>> Object getEnumConst(Class<T> enumType, EnumType type
329338
}
330339

331340
@Override
332-
public Property getGeneratedColumnProperty() {
333-
return propertyMap.get(generatedColumnName);
341+
public Property getProperty(String name) {
342+
return propertyMap.get(name);
334343
}
335344

336345
@Override
337-
public Property getProperty(String name) {
338-
return propertyMap.get(name);
346+
public String[] getGeneratedColumnNames() {
347+
return this.generatedColumnNames;
339348
}
340349

341350
}

0 commit comments

Comments
 (0)