class ColumnIdentifierImpl<ENTITY>
implements ColumnIdentifier<ENTITY> {

    private final String dbmsName;
    private final String schemaName;
    private final String tableName;
    private final String columnName;

    public ColumnIdentifierImpl(
            final String dbmsName,
            final String schemaName,
            final String tableName,
            final String columnName) {
        this.dbmsName   = requireNonNull(dbmsName);
        this.schemaName = requireNonNull(schemaName);
        this.tableName  = requireNonNull(tableName);
        this.columnName = requireNonNull(columnName);
    }

    @Override
    public String getDbmsId() {
        return dbmsName;
    }

    @Override
    public String getSchemaId() {
        return schemaName;
    }

    @Override
    public String getTableId() {
        return tableName;
    }

    @Override
    public String getColumnId() {
        return columnName;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ColumnIdentifier)) return false;

        final ColumnIdentifier<?> that = (ColumnIdentifier<?>) o;
        return getDbmsId().equals(that.getDbmsId())
            && getSchemaId().equals(that.getSchemaId())
            && getTableId().equals(that.getTableId())
            && getColumnId().equals(that.getColumnId());
    }

    @Override
    public int hashCode() {<FILL_FUNCTION_BODY>}

    @Override
    public String toString() {
        return "ColumnIdentifier{" +
            dbmsName + '.' +
            schemaName + '.' +
            tableName + '.' +
            columnName + '}';
    }
}

        int result = getDbmsId().hashCode();
        result = 31 * result + getSchemaId().hashCode();
        result = 31 * result + getTableId().hashCode();
        result = 31 * result + getColumnId().hashCode();
        return result;
    
<no_super_class>