[#1876] NULL constraint violation when storing a copied record
This commit is contained in:
parent
40e60a8de6
commit
4a3e7f6039
@ -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;
|
||||
|
||||
@ -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')/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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;/
|
||||
|
||||
@ -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;/
|
||||
|
||||
@ -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;/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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')/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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')/
|
||||
|
||||
@ -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')/
|
||||
|
||||
@ -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/
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user