Spring Data Neo4J 4 — без template.fetch()

Я пытаюсь обновить Spring Data Neo4J 3 до 4 — я использую Neo4J 2.2.2.

Я использую экземпляр GraphRepository для запроса базы данных и получения объекта.

Этот объект имеет несколько отношений, которые не извлекаются (намеренно, чтобы не читать весь граф).

В коде SDN3 я просто использовал класс Neo4JTemplate для выполнения вызова выборки для каждого отношения, которое мне нужно было получить. Это сработало очень хорошо.

Однако в SDN4 эта возможность была удалена и заменена различными реализациями метода load(). Из документации непонятно, как добиться того, что я сделал в SDN3.

Чтобы было ясно: если у меня есть набор объектов в первом классе, который я извлекаю, управляемый отношением, я хочу получить только объекты в этом наборе, а не всю коллекцию этих объектов в базе данных.

Я пропустил что-то важное в процессе обновления или есть простой способ сделать то, что я пытаюсь сделать?

Добавление кода:

Мой класс сущности:

@NodeEntity
public class File implements MetroNode {

    private Long id;

    private String fileName;

    private SourceState sourceState;

    private Set<State> states;

    @GraphId
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    @Relationship(type = "HAS_FILE", direction = Relationship.INCOMING)
    public SourceState getSourceState() {
        return sourceState;
    }

    public void setSourceState(SourceState sourceState) {
        this.sourceState = sourceState;
    }

    public State addState(MetroNode otherNode, StateStatus status) {
        if (this.states == null) {
            this.states = new HashSet<State>();
        }
        State state = new State(this, otherNode, status.toString());
        this.states.add(state);
        return state;
    }

    @Relationship(type = "HAS_STATE", direction = Relationship.OUTGOING)
    public Set<State> getStates() {
        return states;
    }

    public State getActiveState() {
        if (this.states != null) {
            for (State state : this.states) {
                if (state.isActive()) {
                    return state;
                }
            }
        }
        return null;
    }

}

Мой класс репозитория:

public interface FileRepository extends GraphRepository<File> {

    File findByFileName(String fileName);     
}

При выполнении метода getActiveState() я получаю нулевое значение, потому что набор состояний пуст (не был выбран).

Снова глядя на мой код, я задаюсь вопросом, не потому ли это, что я использую не «родной» метод загрузки из репозитория, а перегруженную версию?


person TrueDub    schedule 15.12.2015    source источник


Ответы (1)


SDN 4 позволяет управлять загрузкой связанных сущностей с помощью горизонт сохраняемости.

При загрузке объекта с глубиной 0 извлекаются свойства объекта, а не связанные объекты. Глубина 1 будет получать первый уровень связанных сущностей, но не их отношения и так далее.

Управление глубиной по типу связи не поддерживается.

person Luanne    schedule 15.12.2015
comment
Спасибо за ваш быстрый ответ. Я прочитал документ, на который вы ссылаетесь, и он содержит это предложение. По умолчанию при загрузке экземпляра сопоставляются простые свойства этого объекта и непосредственно связанные с ним объекты (т. е. глубина = 1). Похоже, это не так в моем приложении, где набор объектов, заданных отношением, не заполняется. Я неправильно понял ситуацию? - person TrueDub; 15.12.2015
comment
Это звучит неправильно. Глубина по умолчанию 1 должна загружать связанные объекты. Можете ли вы обновить свой вопрос с помощью некоторого кода или теста и любых интересных строк в журнале отладки? - person Luanne; 15.12.2015
comment
Какую версию SDN 4 вы используете? Не могли бы вы попробовать то же самое с 4.1.0.BUILD-SNAPSHOT? Вам нужно будет включить ‹repository› ‹id›spring-libs-snapshot‹/id› ‹name›Spring‹/name› ‹url›repo.spring.io/libs-snapshot‹/url› ‹/repository› ‹repository› ‹id›spring-snapshots‹/id› ‹url›repo.spring.io/snapshot‹/url› ‹моментальные снимки›‹включено›true‹/включено ›‹/снимки› ‹/репозиторий› - person Luanne; 15.12.2015
comment
Вам также необходимо убедиться, что любые отношения INCOMING имеют аннотированные методы (если они есть, поля else), поэтому вам нужен @Relationship (type = HAS_FILE, direction = Relationship.INCOMING) также в setSourceState. - person Luanne; 15.12.2015
comment
Я попробую с 4.1.0.BUILD-SNAPHOT как можно скорее. Вы уверены в этой аннотации? Это должно быть в сеттере и геттере в одном классе? Кроме того, я попытался загрузить, выполнив File newFile = template.load(File.class, file.getId(),-1), в качестве эксперимента, и он все еще возвращал значение null для связанных объектов. - person TrueDub; 15.12.2015
comment
Создание на основе этого снимка и репозитория завершается сбоем - не удается найти neo4j-ogm-1.1.4-SNAPSHOT.jar, не существует в указанных вами репозиториях. - person TrueDub; 15.12.2015
comment
Давайте продолжим обсуждение в чате. - person Luanne; 16.12.2015