Получить аннотацию в SDG 2.0, получить вопросы о стратегии

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

  • Можно ли настроить SDG таким образом, чтобы, если загрузка объекта и вызов геттера по отложенному отношению происходили в одной и той же транзакции, запрашиваемая коллекция извлекается автоматически? Вид постоянства Контекст в области транзакции, или, может быть, он запланирован для выпусков функций.
  • Как я могу получить ленивую коллекцию сразу для аннотации @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 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам