Neo4J OGM Session.load(ID) возвращает нулевой объект для существующего идентификатора

Я провожу некоторые тесты Neo4J и сталкиваюсь со следующей своеобразной проблемой. Я создал небольшую модель, которую собираюсь использовать с OGM. Модель имеет суперкласс Entity и дочерний класс Child. Они оба в пакете persistence.model. Объект имеет требуемый Long id; с соответствующим геттером getId().

public abstract class Entity {
   private Long id;
   public Long getId() {
      return id;
   }
}

@NodeEntity
Child extends Entity {
   String name;
   public Child() {
   }
}

Создание дочерних объектов и их сохранение через OGM работает нормально. Я основываюсь на примерах, найденных в документации, и использую объект Neo4jSessionFactory, который инициализирует SessionFactory пакетом persistence.model. Результирующая база данных содержит объекты с правильно заполненными идентификаторами.

Проблема возникает, когда я пытаюсь получить дочерний элемент для данного идентификатора. Я пробую это тремя способами, используя две системы соединения (bolt и ogm):

boltSession.run("MATCH (a:Child) WHERE id(a) = {id} RETURN a", parameters("id", childId));

ogmSession.query("MATCH (a:Child) WHERE id(a) = $id RETURN a", params);

ogmSession.load(Child.class, childId, 1);

Первые два метода фактически возвращают правильные данные. Последний возвращает нулевое значение. Последний, использующий OGM, имеет некоторые очевидные преимущества, и я хотел бы иметь возможность использовать его должным образом. Может кто-то указать мне верное направление?


person Joachim Nielandt    schedule 01.06.2017    source источник
comment
Можно ли предоставить воспроизводимый тестовый пример? Я пробовал именно то, что вы здесь описываете - github.com/neo4j-examples/neo4j-sdn-ogm-issue-report-template/ и работает как положено (т.е. возвращает узел).   -  person František Hartman    schedule 02.06.2017
comment
Я создал несколько тестов с минимальным кодом здесь: github.com/CountZukula/ neo4j-ogm-bug-test-case-template . Просто добавьте один дочерний объект в базу данных, измените имя пользователя/пароль в ogm.properties и Neo4JBolt.java и установите идентификатор нового объекта в классе TestMain.java. В моем случае не проходит только тестовый пример ogmLoad(). Двум другим это удается. Заранее спасибо!   -  person Joachim Nielandt    schedule 07.06.2017


Ответы (1)


В вашем тестовом коде вы выполняете поиск по идентификатору типа int.

private int someIdInYourDatabase = 34617;

Внутренние идентификаторы в Neo4j имеют тип Long.

Если вы измените тип идентификатора на long или Long, он будет работать.

private long someIdInYourDatabase = 34617;
person František Hartman    schedule 07.06.2017
comment
Я мог бы догадаться, что это какая-то глупость. Спасибо, что нашли время! В качестве примечания: есть ли веская причина, по которой интерфейс Java позволяет передавать любой объект ID в session.load()? Возможны ли другие идентификаторы, кроме Longs? - person Joachim Nielandt; 07.06.2017
comment
Да, у вас может быть свойство, аннотированное с помощью @Index(primary=true), например. типа String, и затем вы можете использовать session.load(x, некоторый идентификатор строки) для поиска по свойству. - person František Hartman; 07.06.2017