use of org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource in project hibernate-orm by hibernate.
the class InFlightMetadataCollectorImpl method secondPassCompileForeignKeys.
protected void secondPassCompileForeignKeys(final Table table, Set<ForeignKey> done, final MetadataBuildingContext buildingContext) throws MappingException {
table.createForeignKeys();
Iterator itr = table.getForeignKeyIterator();
while (itr.hasNext()) {
final ForeignKey fk = (ForeignKey) itr.next();
if (!done.contains(fk)) {
done.add(fk);
final String referencedEntityName = fk.getReferencedEntityName();
if (referencedEntityName == null) {
throw new MappingException("An association from the table " + fk.getTable().getName() + " does not specify the referenced entity");
}
log.debugf("Resolving reference to class: %s", referencedEntityName);
final PersistentClass referencedClass = getEntityBinding(referencedEntityName);
if (referencedClass == null) {
throw new MappingException("An association from the table " + fk.getTable().getName() + " refers to an unmapped class: " + referencedEntityName);
}
if (referencedClass.isJoinedSubclass()) {
secondPassCompileForeignKeys(referencedClass.getSuperclass().getTable(), done, buildingContext);
}
fk.setReferencedTable(referencedClass.getTable());
Identifier nameIdentifier;
ImplicitForeignKeyNameSource foreignKeyNameSource = new ImplicitForeignKeyNameSource() {
final List<Identifier> columnNames = extractColumnNames(fk.getColumns());
List<Identifier> referencedColumnNames = null;
@Override
public Identifier getTableName() {
return table.getNameIdentifier();
}
@Override
public List<Identifier> getColumnNames() {
return columnNames;
}
@Override
public Identifier getReferencedTableName() {
return fk.getReferencedTable().getNameIdentifier();
}
@Override
public List<Identifier> getReferencedColumnNames() {
if (referencedColumnNames == null) {
referencedColumnNames = extractColumnNames(fk.getReferencedColumns());
}
return referencedColumnNames;
}
@Override
public Identifier getUserProvidedIdentifier() {
return fk.getName() != null ? Identifier.toIdentifier(fk.getName()) : null;
}
@Override
public MetadataBuildingContext getBuildingContext() {
return buildingContext;
}
};
nameIdentifier = getMetadataBuildingOptions().getImplicitNamingStrategy().determineForeignKeyName(foreignKeyNameSource);
fk.setName(nameIdentifier.render(getDatabase().getJdbcEnvironment().getDialect()));
fk.alignColumns();
}
}
}
Aggregations