Skip to content
Snippets Groups Projects
Verified Commit fbc982d9 authored by Martin Weise's avatar Martin Weise
Browse files

Hotfix Foreign Keys

parent be1d1ad0
Branches
Tags
9 merge requests!296Dev,!293Dev,!289Dev,!287Dev,!285Dev,!284Dev,!283Dev,!281Dev,!279Dev
......@@ -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)
})
......
......@@ -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);
......
......@@ -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
......
......@@ -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());
......
......@@ -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 */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment