class TableIdentifierImpl<ENTITY> implements TableIdentifier<ENTITY> {

    private final String dbmsName;
    private final String schemaName;
    private final String tableName;
    private final int hashCode;

    public TableIdentifierImpl(String dbmsName, String schemaName, String tableName) {
        this.dbmsName = requireNonNull(dbmsName);
        this.schemaName = requireNonNull(schemaName);
        this.tableName = requireNonNull(tableName);
        this.hashCode = privateHashCode();
    }

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

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

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

    @Override
    public int hashCode() {
        return hashCode;
    }

    @Override
    public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

    private int privateHashCode() {
        int hash = 5;
        hash = 53 * hash + Objects.hashCode(dbmsName);
        hash = 53 * hash + Objects.hashCode(schemaName);
        hash = 53 * hash + Objects.hashCode(tableName);
        return hash;
    }

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

        if (this == obj) {
            return true;
        }
        if (obj instanceof TableIdentifier) {
            final TableIdentifier<?> that = (TableIdentifier<?>) obj;
            return Objects.equals(dbmsName, that.getDbmsId())
                && Objects.equals(schemaName, that.getSchemaId())
                && Objects.equals(tableName, that.getTableId());
        }
        return false;
    
<no_super_class>