From dff7dd4229b2873047a05a964e08de1578abccdd Mon Sep 17 00:00:00 2001 From: wea_ondara Date: Thu, 8 Sep 2022 17:05:50 +0200 Subject: [PATCH] drop referencing foreign keys when primary key of entity builder is dropped --- src/main/java/jef/model/KeyBuilder.java | 8 ++- ...rPrimaryDropRelatedForeignKeyDropTest.java | 61 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/test/java/jef/model/KeyBuilderPrimaryDropRelatedForeignKeyDropTest.java diff --git a/src/main/java/jef/model/KeyBuilder.java b/src/main/java/jef/model/KeyBuilder.java index 3f46a02..bdb7aa2 100644 --- a/src/main/java/jef/model/KeyBuilder.java +++ b/src/main/java/jef/model/KeyBuilder.java @@ -144,11 +144,17 @@ public class KeyBuilder { isPrimaryKey(true); } - public void isPrimaryKey(boolean primary) {//TODO foreign key integrity + public void isPrimaryKey(boolean primary) { if (primary) { entity.setPrimaryKey(new PrimaryKeyConstraint(entity, fields)); } else { entity.setPrimaryKey(null); + + //drop referencing foreign keys + modelBuilder.entities().forEach(e -> { + var remove = e.getEntity().getForeignKeys().stream().filter(fk -> fk.getReferencedEntity() == this.entity).toList(); + remove.forEach(fk -> e.getEntity().dropForeignKey(fk)); + }); } } diff --git a/src/test/java/jef/model/KeyBuilderPrimaryDropRelatedForeignKeyDropTest.java b/src/test/java/jef/model/KeyBuilderPrimaryDropRelatedForeignKeyDropTest.java new file mode 100644 index 0000000..432c038 --- /dev/null +++ b/src/test/java/jef/model/KeyBuilderPrimaryDropRelatedForeignKeyDropTest.java @@ -0,0 +1,61 @@ +package jef.model; + +import jef.DbSet; +import jef.model.annotations.Clazz; +import jef.model.annotations.Id; +import jef.serializable.SerializableObject; +import lombok.Getter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class KeyBuilderPrimaryDropRelatedForeignKeyDropTest { + + @Test + public void test() { + var mb = ModelBuilder.from(Ctx.class); + + assertEquals(1, mb.getEntity(TestClass3.class).getForeignKeys().size()); + assertEquals(1, mb.getEntity(TestClass2.class).getForeignKeys().size()); + assertEquals(0, mb.getEntity(TestClass.class).getForeignKeys().size()); + + mb.entity(TestClass.class).hasOne(e -> e.i).isPrimaryKey(false); + + assertEquals(1, mb.getEntity(TestClass3.class).getForeignKeys().size()); + assertEquals(0, mb.getEntity(TestClass2.class).getForeignKeys().size()); + assertEquals(0, mb.getEntity(TestClass.class).getForeignKeys().size()); + } + + public static class Ctx extends DbContext { + @Clazz(TestClass.class) + private DbSet objects1; + @Clazz(TestClass2.class) + private DbSet objects2; + @Clazz(TestClass3.class) + private DbSet objects3; + } + + @Getter + public static class TestClass3 extends SerializableObject { + @Id + public int i3 = 1; + private TestClass2 nested2; + } + + @Getter + public static class TestClass2 extends SerializableObject { + @Id + public int i2 = 1; + private TestClass nested; + } + + @Getter + public static class TestClass extends SerializableObject { + @Id + public int i = 1; + public Object o = new Object(); + public double d; + public float f; + public long l; + } +} \ No newline at end of file