diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
index 89f52c6cb2d2b199e5b1883d10b4969fad3ec612..15986289ba848215a44cd50d7f4f8fdd97b27220 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java
@@ -26,17 +26,17 @@ public class ForeignKeyReference {
     private Long id;
 
     @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
     @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
     private ForeignKey foreignKey;
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false)
     })
     private TableColumn column;
 
-    @ManyToOne(fetch = FetchType.LAZY)
+    @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
     @JoinColumns({
             @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false)
     })
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
index 1cb8f6d3949704cb18f635f1d90af0829d7c95e6..a0a8eab0cfc51369fa540382340d3b00cf358c52 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
@@ -540,17 +540,14 @@ public interface MetadataMapper {
                     pk.getColumn().setDatabaseId(data.getDatabase().getId());
                 });
         for (ForeignKeyDto fk : table.getConstraints().getForeignKeys()) {
+            fk.getTable().setDatabaseId(table.getTdbid());
+            fk.getReferencedTable().setDatabaseId(table.getTdbid());
             for (ForeignKeyReferenceDto ref : fk.getReferences()) {
                 ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
                 ref.getColumn().setTableId(table.getId());
                 ref.getColumn().setDatabaseId(table.getTdbid());
-                final Optional<TableColumn> optional = data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).filter(c -> c.getId().equals(ref.getReferencedColumn().getId())).findFirst();
-                if (optional.isEmpty()) {
-                    log.error("Failed to find foreign key referenced column {}.{} in columns: {}", table.getInternalName(), ref.getReferencedColumn().getInternalName(), data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).toList());
-                    throw new IllegalArgumentException("Failed to find foreign key referenced column");
-                }
-                ref.getReferencedColumn().setTableId(optional.get().getTable().getId());
-                ref.getReferencedColumn().setDatabaseId(optional.get().getTable().getTdbid());
+                ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
+                ref.getReferencedColumn().setDatabaseId(table.getTdbid());
             }
         }
         table.getConstraints()
@@ -594,7 +591,7 @@ public interface MetadataMapper {
     Unique uniqueDtoToUnique(UniqueDto data);
 
     @Mappings({
-            @Mapping(target = "ownedBy", source = "owner.id"),
+            @Mapping(target = "ownedBy", source = "owner.id")
     })
     Table tableDtoToTable(TableDto data);
 
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
index 3312af7c5af638096be77f207d0b6524ea9d0dab..87987f76bc609a2bdcf430510b611cb2d5b8059e 100644
--- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
+++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml
@@ -13,6 +13,7 @@ spring:
         default_schema: fda
         jdbc:
           time_zone: UTC
+        format_sql: false
   application:
     name: metadata-service
   rabbitmq:
@@ -43,6 +44,7 @@ logging:
     root: warn
     at.tuwien.: trace
     org.springframework.security.web.FilterChainProxy: debug
+#    org.hibernate.resource.jdbc: trace
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
 dbrepo:
   repository-name: Database Repository
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
index 28ab4ccb41133b237c033adbf77c85e9dcf7bb3f..8b4e8ce13657453033c2ecf9e27c0450102795db 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
@@ -285,7 +285,9 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
         assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete());
         assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate());
         assertEquals(TABLE_1_ID, table1fk.getTable().getId());
+        assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId());
         assertEquals(TABLE_2_ID, table1fk.getReferencedTable().getId());
+        assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId());
         final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0);
         assertEquals(1L, table1fkr.getId());
         assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId());
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
index 16d23d7af1d31c4bbefa50c607f6ad42b23eac8e..76871aa68ac3ea416ca73df0c990e5588b94300d 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
@@ -6,13 +6,13 @@ import at.tuwien.api.database.DatabaseModifyVisibilityDto;
 import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.internal.CreateDatabaseDto;
 import at.tuwien.api.database.table.TableDto;
-import at.tuwien.api.database.table.columns.ColumnDto;
-import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto;
 import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.*;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.database.table.columns.TableColumn;
+import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey;
+import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference;
 import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
@@ -238,6 +238,46 @@ public class DatabaseServiceImpl implements DatabaseService {
             database.getTables()
                     .add(tableEntity);
         }
+        /* update referenced tables after they are known to the service */
+        for (ForeignKey foreignKey : database.getTables().stream().map(t -> t.getConstraints().getForeignKeys()).flatMap(List::stream).toList()) {
+            log.trace("lookup table {} in tables: {}", foreignKey.getReferencedTable().getInternalName(), database.getTables().stream().map(Table::getInternalName).toList());
+            final Optional<Table> optional = database.getTables()
+                    .stream()
+                    .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName()))
+                    .findFirst();
+            if (optional.isEmpty()) {
+                log.error("Failed to find referenced table: {}.{}", database.getInternalName(), foreignKey.getReferencedTable().getInternalName());
+                throw new IllegalArgumentException("Failed to find referenced table: " + database.getInternalName() + "." + foreignKey.getReferencedTable().getInternalName());
+            }
+            foreignKey.setReferencedTable(optional.get());
+            for (ForeignKeyReference reference : foreignKey.getReferences()) {
+                reference.setForeignKey(foreignKey);
+                final Optional<TableColumn> optional1 = database.getTables()
+                        .stream()
+                        .filter(t -> t.getInternalName().equals(foreignKey.getTable().getInternalName()))
+                        .map(Table::getColumns)
+                        .flatMap(List::stream)
+                        .filter(c -> c.getInternalName().equals(reference.getColumn().getInternalName()))
+                        .findFirst();
+                if (optional1.isEmpty()) {
+                    log.error("Failed to find foreign key column: {}.{}.{}", database.getInternalName(), foreignKey.getTable().getInternalName(), reference.getColumn().getInternalName());
+                    throw new IllegalArgumentException("Failed to find foreign key column: " + reference.getColumn().getInternalName());
+                }
+                reference.setColumn(optional1.get());
+                final Optional<TableColumn> optional2 = database.getTables()
+                        .stream()
+                        .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName()))
+                        .map(Table::getColumns)
+                        .flatMap(List::stream)
+                        .filter(c -> c.getInternalName().equals(reference.getReferencedColumn().getInternalName()))
+                        .findFirst();
+                if (optional2.isEmpty()) {
+                    log.error("Failed to find foreign key referenced column: {}", reference.getReferencedColumn().getInternalName());
+                    throw new IllegalArgumentException("Failed to find foreign key referenced column: " + reference.getReferencedColumn().getInternalName());
+                }
+                reference.setReferencedColumn(optional2.get());
+            }
+        }
         /* update in metadata database */
         database = databaseRepository.save(database);
         /* save in search service */