Полиморфизм класса Spring-Data-Neo4J

ВЫПУСК SDN v3.0.0 Neo4j Community 2.0.1

У меня есть небольшая проблема с наследованием и коллекциями. Возможно, кто-то сможет помочь в этом вопросе. У меня в основном следующая структура.

public abstract class Graphic;

public class Shape1 extends Graphic;

public class Shape2 extends Graphic;

public class Shape3 extends Graphic;

public class Overlay {

    Set<Graphic> graphics;

}

public interface GraphicsRepository extends GraphRepository<Graphic>{}

Я могу сохранить графику, используя графический репозиторий, и все различные атрибуты сохраняются правильно на основе конкретных классов. Я могу запрашивать и получать отдельные графики с правильными атрибутами, а также выполнять различные действия, связанные с классами в среде «портала» neo4j. Но когда я выполняю извлечение на оверлее, я получаю только базовый класс Graphic, поскольку тип класса в коллекции и кастинг не работают. Я мог что-то упустить или просто сделать что-то неправильно, но решил опубликовать и посмотреть, есть ли что-нибудь, что кто-то может предложить. Я искал google и переполнение стека и только когда-либо находил подобные проблемы, когда это был основной класс, а не внутренняя коллекция объектов.

Кроме того, когда я удаляю абстракцию из класса «Графика», я получаю те же результаты… Все элементы в наборе графики «Наложение» относятся к типу «Графика». И добавление @TypeAlias, похоже, не помогает.

Спасибо


person Fire For Effect    schedule 24.03.2014    source источник


Ответы (2)


Хорошо, я нашел проблему… чувствую себя глупо, но я забыл поставить @Fetch в графическую коллекцию. Как ни странно, он извлекает графические объекты, но все они относятся к типу Graphic. Когда я добавил выборку в коллекцию, элементы коллекции были получены с правильным типом.

person Fire For Effect    schedule 26.03.2014

На самом деле он должен использовать тип, хранящийся в графе, для построения объекта, то есть наиболее конкретный тип (в SDN 3.0.1 перед ним стоит «_», поэтому должно быть «_Shape1» и т. д.)

Можете ли вы проверить метки узлов на графике?

person Michael Hunger    schedule 25.03.2014
comment
Михаил, Спасибо за ответ. Я проверил метки на графике, и все узлы имеют правильные метки с префиксом _. Все классы, которые расширяют другие классы, также имеют метки родительского класса. Однако при доступе к коллекции в оверлее тип всегда является графическим, независимо от того, используется ли он через итератор, для каждого цикла и т. д.. - person Fire For Effect; 25.03.2014
comment
Дальнейшее исследование показывает, что графический репозиторий findAll сохраняет информацию о типе, когда я извлекаю графику. Однако OverlayRepository при извлечении графической коллекции этого не делает. Поделюсь более подробной информацией, когда я столкнусь с ними. - person Fire For Effect; 26.03.2014