[#1876] NULL constraint violation when storing a copied record

This commit is contained in:
Lukas Eder 2012-10-22 23:46:23 +02:00
parent 40e60a8de6
commit 4a3e7f6039
16 changed files with 51 additions and 5 deletions

View File

@ -293,6 +293,32 @@ extends BaseTest<A, AP, B, S, B2S, BS, L, X, DATE, BOOL, D, T, U, I, IPK, T658,
assertEquals(Arrays.asList("Coelho", "Orwell"), new ArrayList<String>(authorNames));
}
@Test
public void testUpdatablesCopy() throws Exception {
if (TTriggers() == null) {
log.info("SKIPPING", "UpdatableRecord.copy() tests");
return;
}
jOOQAbstractTest.reset = false;
T r1 = create().newRecord(TTriggers());
r1.setValue(TTriggers_COUNTER(), 1);
assertEquals(1, r1.store());
T r2 = r1.copy();
T r3 = create().fetchOne(TTriggers());
T r4 = r3.copy();
// [#1874] Be sure that copies use "default" values for primary keys
// in order to have sequence values generated.
assertEquals(1, r2.store());
assertEquals(0, r3.store());
assertEquals(1, r4.store());
assertEquals(3, (int) create().selectCount().from(TTriggers()).fetchOne(0, int.class));
}
@Test
public void testUpdatablesPK() throws Exception {
jOOQAbstractTest.reset = false;

View File

@ -15,6 +15,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/
INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SERIAL s_author_id/
CREATE SERIAL s_author_id MAXVALUE 2000000000/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE s_author_id/
CREATE SEQUENCE s_author_id/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE s_author_id RESTRICT/
CREATE SEQUENCE s_author_id START WITH 1/

View File

@ -13,6 +13,7 @@ DELETE FROM t_author/
DELETE FROM t_language/
DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_triggers/
DROP SEQUENCE s_author_id;/
CREATE SEQUENCE s_author_id;/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE IF EXISTS s_author_id;/
CREATE SEQUENCE s_author_id START WITH 1;/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE IF EXISTS s_author_id;/
CREATE SEQUENCE s_author_id START WITH 1;/

View File

@ -15,6 +15,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE s_author_id/
CREATE SEQUENCE s_author_id/

View File

@ -1289,6 +1289,11 @@ public abstract class jOOQAbstractTest<
new CRUDTests(this).testRelations();
}
@Test
public void testUpdatablesCopy() throws Exception {
new CRUDTests(this).testUpdatablesCopy();
}
@Test
public void testUpdatablesPK() throws Exception {
new CRUDTests(this).testUpdatablesPK();

View File

@ -14,6 +14,7 @@ DELETE FROM t_language/
DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/
INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/

View File

@ -16,6 +16,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE IF EXISTS s_author_id/
CREATE SEQUENCE s_author_id/

View File

@ -13,6 +13,7 @@ DELETE FROM t_author/
DELETE FROM t_language/
DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_triggers/
INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/
INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/

View File

@ -15,6 +15,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
INSERT INTO t_language (id, cd, description, description_english) VALUES (1, 'en', 'English', 'English')/
INSERT INTO t_language (id, cd, description, description_english) VALUES (2, 'de', 'Deutsch', 'German')/

View File

@ -15,6 +15,7 @@ DELETE FROM t_booleans/
DELETE FROM t_dates/
DELETE FROM t_identity/
DELETE FROM t_identity_pk/
DELETE FROM t_triggers/
DROP SEQUENCE s_author_id/
CREATE SEQUENCE s_author_id/

View File

@ -36,9 +36,11 @@
package org.jooq.impl;
import java.util.Collection;
import java.util.List;
import org.jooq.Field;
import org.jooq.Record;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.UpdatableRecord;
import org.jooq.UpdatableTable;
@ -98,13 +100,13 @@ public class UpdatableRecordImpl<R extends UpdatableRecord<R>> extends TableReco
R copy = create().newRecord(getTable());
// Copy all fields. This marks them all as isChanged, which is important
List<TableField<R, ?>> key = getMainKey().getFields();
for (Field<?> field : getFields()) {
setValue(copy, field);
}
// Remove key values again
for (Field<?> field : getMainKey().getFields()) {
copy.setValue(field, null);
// Don't copy key values
if (!key.contains(field)) {
setValue(copy, field);
}
}
return copy;