Получить аннотацию в SDG 2.0, получить вопросы о стратегии - PullRequest
6 голосов
/ 22 ноября 2011

Привет всем терпеливым разработчикам, использующим граф данных пружины. Поскольку документации так мало, и охват тестов довольно слаб, иногда очень трудно понять, каково ожидаемое поведение базовой платформы и как она должна работать. В настоящее время у меня есть несколько вопросов, связанных с новым подходом извлечения, введенным в SDG 1.1. В отличие от SDG 1.1, запись \ чтение через 2.0 только отношения и связанный объект, аннотированный аннотацией @Fetch, извлекаются с нетерпением, другие, как предполагается, выбираются лениво ... и теперь мой первый вопрос:

  • Можно ли настроить SDG, чтобы при загрузке объекта и вызов getter для ленивых отношений происходит в той же транзакции, запрашиваемая коллекция извлекается автоматически? Вид настойчивости Контекст в области транзакции, или, возможно, это запланировано для функции релизы.
  • Как я могу получить ленивую коллекцию сразу для аннотации @RelatedTo? Метод fetch () от Neo4jOperation позволяет получить только одну сущность. Должен ли я перебирать весь список и извлекать сущность для каждого объекта? Как лучше всего проверить, что данный объект уже получен / инициализирован или нет?
  • В качестве рекомендации я думаю, что было бы более интуитивно понятно, если вместо получения NPE при работе с неинициализированными объектами возникнет своего рода отложенное исключение загрузки. Более того, это поведение вводит в заблуждение, поскольку, когда объект не инициализирован и все свойства-члены не равны нулю, кроме id, метод equals может обеспечить значение true для различных объектов, которые не были инициализированы, что является довольно серьезными проблемами, например, для применения наборов
  • Еще одна проблема, которую я заметил при работе с SDG 2.0.0.RC1, заключается в следующем: когда я добавляю новый объект в коллекцию без выборки, иногда он добавляется и сохраняется должным образом, а иногда - нет. Я написал тест для этого случая, и он работает недетерминированным образом. Иногда это терпит неудачу, иногда заканчивается успехом. Вот пример использования:

    Group groupFromDb = neoTemplate.findOne(group.getId(), Group.class);
    assertNotNull(groupFromDb);
    assertEquals("Number of members must be equals to 1", 1,    groupFromDb.getMembers().size());
    User secondMember = UserMappingTest.createUser("secondMember");
    groupFromDb.addMember(secondMember);
    neoTemplate.save(groupFromDb);
    Group groupAfterChange = neoTemplate.findOne(groupFromDb.getId(), Group.class);
    assertNotNull(groupAfterChange);
    assertEquals("Number of members must be equals to saved entity", groupFromDb.getMembers().size(), groupAfterChange.getMembers().size());
    assertEquals("Number of members must be equals to 2", 2, groupAfterChange.getMembers().size());
    

Этот тест иногда завершается неудачно при последнем утверждении, что означает, что иногда член добавляется в набор, а иногда нет. Я предполагаю, что проблема лежит где-то в ManagedFieldAccessorSet, но это трудно сказать, так как это не является детерминированным. Я запускаю тест с mvn2 и mvn3 с java 1.6_22 и 1.6_27, и я всегда получаю один и тот же результат: иногда все в порядке, иногда тест не проходит. Реализация User equals выглядит следующим образом:

@Override
public boolean equals(final Object other) {
    if ( !(other instanceof User) ) {
        return false;
    }
    User castOther = (User) other;
    if(castOther.getId() == this.getId()) {
        return true;
    } 
    return new EqualsBuilder().append(username, castOther.username).isEquals();
}

- Мне также немного проблематично, что для объектов, аннотированных @Fetch, используется java HashSet, который является сериализуемым, в то время как при использовании ленивых загруженных полей используется ManagedFieldAccessorSet, который не сериализуем и вызывает не сериализуемое исключение.

Любая помощь или совет приветствуются. Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Я собрал небольшой пример кода, показывающий, как использовать технику fetch (), которую описывает Майкл:

http://springinpractice.com/2011/12/28/initializing-lazy-loaded-collections-with-spring-data-neo4j/

3 голосов
/ 23 ноября 2011

Простой подход к отображению был добавлен только в Spring Data Neo4j 2.0, поэтому он не так совершенен, как расширенное отображение AspectJ.В настоящее время мы работаем над документированием этого более подробно.

Опция отложенной загрузки также была добавлена ​​в последнее время.Так что ваши отзывы очень приветствуются.

В настоящее время SDN не использует прокси-подход для лениво загруженных объектов.Таким образом, автоматическое извлечение при доступе (пока) не поддерживается.Вот почему также не генерируется исключение при доступе к незагруженным полям, и нет способа «обнаружить», если объект был загружен не полностью.

В текущем снимке есть операция template.fetch() для полной загрузки отложенных загруженных объектов и коллекций.

Мы рассмотрим проблему HashSet vs. ManagedSet, верно, что этоне очень хорошее решение.

Для теста.getId () возвращает объект Long или long примитив?Возможно, здесь целесообразно использовать getId().equals(castOther.getId()), поскольку для Number объектов равенство ссылок не гарантируется.

...