[#814] Change TableRecord to reload its trigger-initialised main key in Oracle and other RDBMS that don't support IDENTITY columns

This commit is contained in:
Lukas Eder 2011-08-29 18:56:28 +00:00
parent 8106cc5a0d
commit b27a71f8fa
3 changed files with 48 additions and 21 deletions

View File

@ -3576,8 +3576,13 @@ public abstract class jOOQAbstractTest<
return;
}
// Non-DSL querying
// ----------------
InsertQuery<T> query;
int ID = 0;
// Without RETURNING clause
query = create().insertQuery(TTriggers());
query.addValue(TTriggers_COUNTER(), 0);
@ -3586,8 +3591,8 @@ public abstract class jOOQAbstractTest<
// Check if the trigger works correctly
assertEquals(1, create().selectFrom(TTriggers()).fetch().size());
assertEquals(1, (int) create().selectFrom(TTriggers()).fetchOne(TTriggers_ID()));
assertEquals(2, (int) create().selectFrom(TTriggers()).fetchOne(TTriggers_COUNTER()));
assertEquals(++ID, (int) create().selectFrom(TTriggers()).fetchOne(TTriggers_ID()));
assertEquals(2*ID, (int) create().selectFrom(TTriggers()).fetchOne(TTriggers_COUNTER()));
// Returning all fields
query = create().insertQuery(TTriggers());
@ -3595,8 +3600,8 @@ public abstract class jOOQAbstractTest<
query.setReturning();
assertEquals(1, query.execute());
assertNotNull(query.getReturned());
assertEquals(2, (int) query.getReturned().getValue(TTriggers_ID()));
assertEquals(4, (int) query.getReturned().getValue(TTriggers_COUNTER()));
assertEquals(++ID, (int) query.getReturned().getValue(TTriggers_ID()));
assertEquals(2*ID, (int) query.getReturned().getValue(TTriggers_COUNTER()));
// Returning only the ID field
query = create().insertQuery(TTriggers());
@ -3604,11 +3609,23 @@ public abstract class jOOQAbstractTest<
query.setReturning(TTriggers_ID());
assertEquals(1, query.execute());
assertNotNull(query.getReturned());
assertEquals(3, (int) query.getReturned().getValue(TTriggers_ID()));
assertEquals(++ID, (int) query.getReturned().getValue(TTriggers_ID()));
assertNull(query.getReturned().getValue(TTriggers_COUNTER()));
query.getReturned().refresh();
assertEquals(6, (int) query.getReturned().getValue(TTriggers_COUNTER()));
assertEquals(2*ID, (int) query.getReturned().getValue(TTriggers_COUNTER()));
// TODO [#813] DSL querying
// ------------------------
// store() and similar methods
T triggered = create().newRecord(TTriggers());
triggered.setValue(TTriggers_COUNTER(), 0);
assertEquals(1, triggered.store());
assertEquals(++ID, (int) triggered.getValue(TTriggers_ID()));
assertEquals(0, (int) triggered.getValue(TTriggers_COUNTER()));
triggered.refresh();
assertEquals(2*ID, (int) triggered.getValue(TTriggers_COUNTER()));
}
@Test

View File

@ -36,12 +36,13 @@
package org.jooq.impl;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import org.jooq.ConditionProvider;
import org.jooq.Configuration;
import org.jooq.DeleteQuery;
import org.jooq.Field;
import org.jooq.Identity;
import org.jooq.InsertQuery;
import org.jooq.SimpleSelectQuery;
import org.jooq.StoreQuery;
@ -130,20 +131,17 @@ public class TableRecordImpl<R extends TableRecord<R>> extends TypeRecord<Table<
}
}
// TODO [#814] Reload also the primary key, as it might be
// 1. different from the identity
// 2. initialised by a trigger
Identity<R, ? extends Number> identity = identity();
insert.setReturning(identity);
// [#814] Refresh identity and/or main unique key values
List<Field<?>> key = getKey();
insert.setReturning(key);
int result = insert.execute();
// If an insert was successful try fetching the generated IDENTITY value
if (identity != null && result > 0) {
if (!key.isEmpty() && result > 0) {
if (insert.getReturned() != null) {
setValue0(identity.getField(), new Value<Number>(insert.getReturned().getValue(identity.getField())));
}
else {
setValue0(identity.getField(), new Value<Number>(create().lastID(identity)));
for (Field<?> field : key) {
setValue0(field, new Value<Object>(insert.getReturned().getValue(field)));
}
}
}
@ -153,8 +151,8 @@ public class TableRecordImpl<R extends TableRecord<R>> extends TypeRecord<Table<
/**
* Subclasses may override this method to provide an identity
*/
Identity<R, ? extends Number> identity() {
return null;
List<Field<?>> getKey() {
return Collections.emptyList();
}
@SuppressWarnings("unchecked")

View File

@ -36,6 +36,10 @@
package org.jooq.impl;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.jooq.Configuration;
import org.jooq.Field;
@ -110,8 +114,16 @@ public class UpdatableRecordImpl<R extends TableRecord<R>> extends TableRecordIm
}
@Override
final Identity<R, ? extends Number> identity() {
return getTable().getIdentity();
List<Field<?>> getKey() {
Set<Field<?>> result = new LinkedHashSet<Field<?>>();
Identity<R, ?> identity = getTable().getIdentity();
if (identity != null) {
result.add(identity.getField());
}
result.addAll(getMainKey().getFields());
return new ArrayList<Field<?>>(result);
}
@Override