Skip to content

Commit 7c1b904

Browse files
committed
#334 Corrections for insert with @idgenerator
1 parent 532331b commit 7c1b904

File tree

5 files changed

+33
-22
lines changed

5 files changed

+33
-22
lines changed

activejdbc/src/main/java/org/javalite/activejdbc/DB.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -597,27 +597,25 @@ Object execInsert(String query, String autoIncrementColumnName, Object... params
597597
ps = connection.prepareStatement(query, new String[]{autoIncrementColumnName});
598598
StatementCache.instance().cache(connection, query, ps);
599599
}
600-
for (int index = 0; index < params.length; index++) {
601-
Object param = params[index];
600+
for (int index = 0; index < params.length;) {
601+
Object param = params[index++];
602602
if (param instanceof byte[]) {
603603
byte[] bytes = (byte[]) param;
604604
try {
605605
Blob blob = connection.createBlob();
606606
if (blob == null) { // SQLite
607-
ps.setBytes(index + 1, bytes);
607+
ps.setBytes(index, bytes);
608608
} else {
609609
blob.setBytes(1, bytes);
610-
ps.setBlob(index + 1, blob);
610+
ps.setBlob(index, blob);
611611
}
612612
} catch (AbstractMethodError e) {// net.sourceforge.jtds.jdbc.ConnectionJDBC2.createBlob is abstract :)
613-
ps.setObject(index + 1, param);
614-
} catch (SQLFeatureNotSupportedException e) {
615-
ps.setObject(index + 1, param);
613+
ps.setObject(index, param);
616614
} catch (SQLException e) {
617-
ps.setObject(index + 1, param);
615+
ps.setObject(index, param);
618616
}
619-
}else{
620-
ps.setObject(index + 1, param);
617+
} else {
618+
ps.setObject(index, param);
621619
}
622620
}
623621

activejdbc/src/main/java/org/javalite/activejdbc/Model.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2567,13 +2567,8 @@ public boolean insert() {
25672567
doUpdatedAt();
25682568

25692569
MetaModel metaModel = getMetaModelLocal();
2570-
boolean containsId = (attributes.get(metaModel.getIdName()) != null);
25712570
List<String> columns = new ArrayList<String>();
25722571
List<Object> values = new ArrayList<Object>();
2573-
if (!containsId && metaModel.getIdGeneratorCode() != null) {
2574-
columns.add(metaModel.getIdName());
2575-
values.add(metaModel.getIdGeneratorCode());
2576-
}
25772572
for (Map.Entry<String, Object> entry : attributes.entrySet()) {
25782573
if (entry.getValue() == null || metaModel.getVersionColumn().equals(entry.getKey())) {
25792574
continue;
@@ -2589,13 +2584,14 @@ public boolean insert() {
25892584
//TODO: need to invoke checkAttributes here too, and maybe rely on MetaModel for this.
25902585

25912586
try {
2587+
boolean containsId = attributes.containsKey(metaModel.getIdName());
25922588
boolean done;
2593-
String query = metaModel.getDialect().insertParametrized(metaModel, columns);
2589+
String query = metaModel.getDialect().insertParametrized(metaModel, columns, containsId);
25942590
if (containsId) {
25952591
done = (1 == new DB(metaModel.getDbName()).exec(query, values.toArray()));
25962592
} else {
25972593
Object id = new DB(metaModel.getDbName()).execInsert(query, getIdName(), values.toArray());
2598-
attributes.put(getIdName(), id);
2594+
attributes.put(metaModel.getIdName(), id);
25992595
done = (id != null);
26002596
}
26012597
if (metaModel.cached()) {

activejdbc/src/main/java/org/javalite/activejdbc/dialects/DefaultDialect.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,21 @@ public String insertManyToManyAssociation(Many2ManyAssociation association) {
163163
}
164164

165165
@Override
166-
public String insertParametrized(MetaModel metaModel, List<String> columns) {
166+
public String insertParametrized(MetaModel metaModel, List<String> columns, boolean containsId) {
167167
StringBuilder query = new StringBuilder().append("INSERT INTO ").append(metaModel.getTableName()).append(' ');
168168
if (columns.isEmpty()) {
169169
appendEmptyRow(metaModel, query);
170170
} else {
171+
boolean addIdGeneratorCode = (!containsId && metaModel.getIdGeneratorCode() != null);
171172
query.append('(');
173+
if (addIdGeneratorCode) {
174+
query.append(metaModel.getIdName()).append(", ");
175+
}
172176
join(query, columns, ", ");
173177
query.append(") VALUES (");
178+
if (addIdGeneratorCode) {
179+
query.append(metaModel.getIdGeneratorCode()).append(", ");
180+
}
174181
appendQuestions(query, columns.size());
175182
query.append(')');
176183
}
@@ -217,9 +224,17 @@ public String insert(MetaModel metaModel, Map<String, Object> attributes) {
217224
if (attributes.isEmpty()) {
218225
appendEmptyRow(metaModel, query);
219226
} else {
227+
boolean addIdGeneratorCode = (!attributes.containsKey(metaModel.getIdName())
228+
&& metaModel.getIdGeneratorCode() != null);
220229
query.append('(');
230+
if (addIdGeneratorCode) {
231+
query.append(metaModel.getIdName()).append(", ");
232+
}
221233
join(query, attributes.keySet(), ", ");
222234
query.append(") VALUES (");
235+
if (addIdGeneratorCode) {
236+
query.append(metaModel.getIdGeneratorCode()).append(", ");
237+
}
223238
Iterator<Object> it = attributes.values().iterator();
224239
appendValue(query, it.next());
225240
while (it.hasNext()) {

activejdbc/src/main/java/org/javalite/activejdbc/dialects/Dialect.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ public interface Dialect {
4646

4747
String insertManyToManyAssociation(Many2ManyAssociation association);
4848

49-
String insertParametrized(MetaModel metaModel, List<String> columns);
49+
String insertParametrized(MetaModel metaModel, List<String> columns, boolean containsId);
5050

5151
String deleteManyToManyAssociation(Many2ManyAssociation association);
5252

5353
String insert(MetaModel metaModel, Map<String, Object> attributes);
54-
54+
5555
String update(MetaModel metaModel, Map<String, Object> attributes);
56-
56+
5757
}

activejdbc/src/main/java/org/javalite/activejdbc/dialects/OracleDialect.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ public String formSelect(String tableName, String subQuery, List<String> orderBy
7878

7979
@Override
8080
protected void appendEmptyRow(MetaModel metaModel, StringBuilder query) {
81-
query.append('(').append(metaModel.getIdName()).append(") VALUES (null)");
81+
query.append('(').append(metaModel.getIdName()).append(") VALUES (")
82+
.append(metaModel.getIdGeneratorCode() != null ? metaModel.getIdGeneratorCode() : "NULL")
83+
.append(')');
8284
}
8385

8486
@Override

0 commit comments

Comments
 (0)