Как обрабатывать абстрактные типы в @IndexedEmbedded includepaths?

Я пытаюсь создать индекс lucene для модели, частично состоящей из абстрактных классов. Скажем, я хочу проиндексировать класс A, у которого есть метод для возврата списка элементов класса B, каждый из которых имеет объект абстрактного класса C, который имеет абстрактный метод getD () для возврата списка элементов класса D. Класс E и F расширяют класс C и оба реализуют метод getD (), для которого я создал реализацию FieldBridge (реализует StringBridge) для преобразования результата в текстовый вывод, который будет использоваться для индекса.

Документация по поиску Hibernate не очень подробно описывает, как работать с наследованием и как их можно использовать вместе с аннотацией @IndexedEmbedded. Я попробовал наивный подход, просто предоставив c.getD как includePath, надеясь, что реализации getD подклассов c будут использоваться автоматически. Это приводит к следующему SearchException при запуске сервера:

org.hibernate.search.SearchException: Found invalid @IndexedEmbedded->paths configured on class A, member vragen: b.c.getD

Кто-нибудь знает, как задать путь поиска или изменить код любым другим способом, чтобы получить строку, созданную реализацией FieldBridge, в индексе для класса A? Код представлен ниже:

@Indexed
public class A {
    @IndexedEmbedded(includePaths = { "c.getD" })
    public List<B> getB() {
        // Method implementation returning a list of B
    }
}

public class B{
    private C c;
}

public abstract class C{
    public abstract List<D> getD();
}

public class E extends C{
    @Field
    @FieldBridge(impl = DListFieldBridge.class)
    public List<D> getD() {
        // Method implementation returning a list of D
    }
}

public class F extends C{
    @Field
    @FieldBridge(impl = DListFieldBridge.class)
    public List<D> getD() {
        // Method implementation returning a list of D
    }
}

person Niek Tax    schedule 05.05.2013    source источник


Ответы (1)


В настоящее время это невозможно. Метаданные создаются на основе информации статического класса, а не фактических типов среды выполнения. Также нет способа определить, какие классы расширяют C при построении метамодели.

person Hardy    schedule 10.05.2013