[#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:
parent
8106cc5a0d
commit
b27a71f8fa
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user