Search in sources :

Example 1 with ImplicitForeignKeyNameSource

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();
        }
    }
}
Also used : Identifier(org.hibernate.boot.model.naming.Identifier) Iterator(java.util.Iterator) ImplicitForeignKeyNameSource(org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource) List(java.util.List) ArrayList(java.util.ArrayList) ForeignKey(org.hibernate.mapping.ForeignKey) DuplicateMappingException(org.hibernate.DuplicateMappingException) MappingException(org.hibernate.MappingException) PersistentClass(org.hibernate.mapping.PersistentClass)

Aggregations

ArrayList (java.util.ArrayList)1 Iterator (java.util.Iterator)1 List (java.util.List)1 DuplicateMappingException (org.hibernate.DuplicateMappingException)1 MappingException (org.hibernate.MappingException)1 Identifier (org.hibernate.boot.model.naming.Identifier)1 ImplicitForeignKeyNameSource (org.hibernate.boot.model.naming.ImplicitForeignKeyNameSource)1 ForeignKey (org.hibernate.mapping.ForeignKey)1 PersistentClass (org.hibernate.mapping.PersistentClass)1